IBM Domino 10 - интеграция с резервированием ресурсов через API служб данных Domino - PullRequest
1 голос
/ 12 марта 2019

Мы пытаемся интегрироваться с IBM Domino через REST API, чтобы извлекать информацию о резервированиях / событиях в определенной комнате, а также иметь возможность удаленно создавать новые события / резервирования.Мы уже интегрировались с другими службами, такими как Microsoft Exchange, но IBM кажется самой сложной из них.Я глубоко изучил его, прочитал тысячи статей и вопросов о переполнении стека, и продвинулся довольно далеко, но все еще не могу извлечь из этого никакой реальной пользы.

В настоящее время я планирую сделать следующее:

  • Извлечение информации о бронировании из / api / data / collection / name / ($ Reservations) или ($ Calendar)

  • Создание событий / бронирований с использованиемDocuments api, POSTing в / api / data / documents? form = Reservation, я уже пытался это сделать, и мое резервирование даже показывалось в Domino Admin (но не в клиенте Notes), но в нем были некоторые ошибки (возможно, просто некоторые проблемы с json на моемсторона)

Хотя это выглядит довольно ясно и просто, на самом деле это не так.У меня есть несколько вопросов:

  1. Как я могу получить бронирование / календарь для определенной комнаты?($ Calendar) возвращает все события в базе данных, даже не считая, в какой комнате это находится, чтобы получить эту информацию, мне нужно было бы дополнительно запросить каждое резервирование по его unid, и это, вероятно, убило бы все приложение

  2. Можно ли каким-либо образом отфильтровать / выполнить поиск / api / data / documents для возврата только тех документов, у которых поле form имеет значение Reservation или любое другое значение?Таким образом, я мог получить все документы резервирования, не запрашивая каждый из документов напрямую (/ api / data / documents возвращает только href в документ без каких-либо интересных данных), мне также не нужно было бы дополнительно включать DAS для каждого видахочу использовать.

  3. Какие поля типа $25 возвращены в json, и как я могу узнать, какова их цель, если у них нет реального имени?Они часто содержат интересные данные, такие как название комнаты.

Я также изучил API-интерфейс FreeBusy, и это довольно интересно, и я мог легко использовать его для поиска бронирований (/ busytimes) в номер, который я хочу, если он когда-либо возвращал, какой ресурс / бронирование вызывает занятое время.Он просто показывает время начала и окончания, больше ничего ..

Я также читал предложения о том, что нужно создать «основного» пользователя для обработки резервирований и использовать его календарь api (/ api / calendar / events),но на самом деле это не может быть сделано.Однако я попытался создать события в календаре пользователей в указанной комнате, и вроде бы заставил его работать, добавив следующего участника в json | (на самом деле синтаксис PHP):

'organizer' => [ 'email' => 'admin/test@test.com' ],
'attendees' => [
    [
        'role' => 'req-participant',
        'userType' => 'room',
        'status' => 'accepted',
        'rsvp' => true,
        'email' => 'testroom@test.com',
    ],
],

Но на самом деле это не такотображаются в бронировании номеров, в отличие от обычных событий, созданных в IBM Notes.Он также не может быть отредактирован или удален в IBM Notes, и перед субъектом стоит «Принятый:», и в нем говорится, что «посещаемость делегирована для администратора».Чтобы удалить его, мне нужно удалить его через API через его unid напрямую.x-lotus-noticetype устанавливается на A, так что я думаю, что это рассматривается не как собрание, а как уведомление, хотя понятия не имею, почему.

Мне действительно нужна помощь или предложения о том, как я могу получитьэто работает, есть ли другие способы, которые будут иметь какой-либо смысл?

Редактировать: После долгих попыток и прочтения ответа Дейва, я думаю, было бы хорошим решением иметь одного пользователяЭто сделало бы резервирование через API календаря, потому что API прямых данных, вероятно, не будет работать.Я мог бы просто вытащить список всех бронирований из базы данных Rooms ($ Calendar) или ($ Reservations) или сделать что-то свое. Однако! Я не могу заставить метод календаря работать на моем локальном сервере IBM Domino. Дейв указал мне, что мне нужно указать действительный адрес электронной почты (интернет-адрес) организатора, поэтому я установил для своего пользователя интернет-адрес testmail@test.test (test.test сопоставлен с 127.0.0.1 в файле hosts). Теперь, как только я попытаюсь использовать этот адрес, вот так:

"organizer": {
    "email": "testmail@test.test"
}

Я даже не могу создать событие / резервирование (через /mail/admin.nsf/api/calendar/events), оно возвращает внутреннюю ошибку 500 с помощью cserror 1026 и журналы Domino

[CS API]> Error | calendarapi.c(379) : There was an error sending out notices to meeting participants. (0x8E4)
Error connecting to server test/test: The remote server is not a known TCP/IP host.

Таким образом, у него есть проблема с отправкой уведомления, и он вообще не создает событие. Я подумал, что это может не работать с localhost, поэтому я настроил электронную почту своих пользователей на внешнюю почтовую службу и даже получил письмо, но событие все равно было создано неправильно (x-lotus-noticetype A добавляется автоматически и переопределяет все, что я отправляю как значение), он не отображается в базе данных бронирования номеров.

Вот объект json события, созданного с помощью клиента Notes:

  "events": [
    {
      "href":"\/mail\/admin.nsf\/api\/calendar\/events\/2B35FABBC50EA4D0C12583BC002E26FA-Lotus_Notes_Generated",
      "id":"2B35FABBC50EA4D0C12583BC002E26FA-Lotus_Notes_Generated",
      "summary":"Notes client meeting",
      "location":"Test room\/Test site@test",
      "start": {
        "date":"2019-03-13",
        "time":"09:30:00",
        "tzid":"Central European Standard Time"
      },
      "end": {
        "date":"2019-03-13",
        "time":"10:30:00",
        "tzid":"Central European Standard Time"
      },
      "class":"public",
      "transparency":"opaque",
      "sequence":0,
      "last-modified":"20190313T082436Z",
      "attendees": [
                {
          "role":"chair",
          "status":"accepted",
          "rsvp":false,
          "displayName":"admin\/test",
          "email":"testmail@test.test"
        },
                {
          "role":"req-participant",
          "userType":"room",
          "status":"needs-action",
          "rsvp":true,
          "displayName":"Test room\/Test site",
          "email":"room@test.test"
        }
      ],
      "organizer": {
        "displayName":"admin\/test",
        "email":"testmail@test.test"
      },
      "x-lotus-broadcast": {
        "data":"FALSE"
      },
      "x-lotus-notesversion": {
        "data":"2"
      },
      "x-lotus-appttype": {
        "data":"3"
      }
    }
  ]

Как видите, Notes может успешно создать событие с testmail@test.test.

Теперь вот событие, созданное с моим API, но с admin/test@test.test в качестве электронной почты организатора (поскольку обычная электронная почта не позволяет мне создать событие):

 "events": [
    {
      "href":"\/mail\/admin.nsf\/api\/calendar\/events\/E1D1F752203FC2DFC12583BC002FCB12-Lotus_Auto_Generated",
      "id":"E1D1F752203FC2DFC12583BC002FCB12-Lotus_Auto_Generated",
      "summary":"Api reservation test",
      "location":"Test room\/Test site@test\r\nCN=Test room\/O=Test site",
      "description":"API Generated event\r\n",
      "start": {
        "date":"2019-03-20",
        "time":"11:00:00",
        "utc":true
      },
      "end": {
        "date":"2019-03-20",
        "time":"15:00:00",
        "utc":true
      },
      "class":"public",
      "transparency":"opaque",
      "sequence":0,
      "last-modified":"20190313T084201Z",
      "attendees": [
                {
          "role":"chair",
          "status":"accepted",
          "rsvp":false,
          "displayName":"admin\/test",
          "email":"testmail@test.test"
        },
                {
          "role":"req-participant",
          "userType":"room",
          "status":"needs-action",
          "rsvp":true,
          "displayName":"Test room\/Test site",
          "email":"room@test.test"
        }
      ],
      "organizer": {
        "displayName":"admin\/test",
        "email":"testmail@test.test"
      },
      "x-lotus-broadcast": {
        "data":"FALSE"
      },
      "x-lotus-notesversion": {
        "data":"2"
      },
      "x-lotus-noticetype": {
        "data":"A"
      },
      "x-lotus-appttype": {
        "data":"3"
      }
    }
  ]

Как видите, электронные письма организатора и председателя были автоматически обновлены Lotus до testmail@test.test, и теоретически все должно работать, но это не так. В Notes я вижу событие как «Принятый: тест резервирования Api» и не могу изменить такие вещи, как комната, или у меня нет возможности удалить его из контекстного меню (хотя я могу удалить его кнопкой Del) Разница лишь в том, что добавлено x-lotus-noticetype get, и я даже не знаю, почему

Редактировать 2: Я получил это на работу! Дэйв указал, что у меня могут быть некоторые проблемы с конфигурацией, поэтому я переустановил сервер и заново все установил (включая почтовые службы), использовал admin@test.test, и собрание было успешно создано и добавлено в резервирование комнаты. Консоль сервера только показала, что сообщение доставлено. ТЕМ НЕ МЕНИЕ! Мне удалось создать столько идентичных собраний, сколько я хотел, они не были добавлены в базу данных резервирований, но были успешно созданы в моем календаре (с назначенной им комнатой) без каких-либо ошибок (даже не в серверной консоли) это явно плохо. Есть ли способ проверить (внешне, через API), успешно ли было создано резервирование, и предотвратить его создание, если комната в этот момент занята? Клиент Notes выдает ошибку, когда комната занята. Я мог бы, вероятно, использовать API FreeBusy, однако для этого потребовался бы другой HTTP-запрос перед каждой попыткой резервирования, но если это единственный способ, я просто возьму его. Я вижу, что поле status в комнате для посетителей установлено на declined, но ответ от POST по-прежнему содержит needs-action, поэтому мне нужно будет сделать еще один отложенный запрос, чтобы проверить, изменилось ли состояние на отклоненное. или нет.

Кроме того, хотя это работает, я до сих пор не знаю, как я могу получить список бронирований в выбранной комнате? Уже существующие представления в базе данных Reservations не дают много подробностей, и для их работы необходимо включить исключительно службы DAS. Есть ли другой способ, который мог бы работать должным образом?

Другое дело, могу ли я получить адрес электронной почты текущего пользователя, чтобы использовать его для резервирования, или я могу только «жестко» его кодировать вручную? То же самое касается электронной почты комнаты. В настоящее время мне нужно иметь:

  • Имя пользователя
  • Пароль пользователя
  • База данных почты пользователя (/mail/admin.nsf/)
  • Электронная почта пользователя
  • Номер электронной почты

и если я захочу напрямую прочитать некоторые данные из базы данных Reservations, мне также понадобится указать путь к этой базе данных. Это не очень удобно для пользователя, я хотел бы автоматизировать некоторые вещи, если это возможно. В противном случае интеграция может оказаться невозможной.

1 Ответ

0 голосов
/ 12 марта 2019

База данных резервирования была разработана для управления резервированием либо (1) напрямую через собственный интерфейс пользователя, либо (2) косвенно путем автоматической обработки уведомлений от пользователей календаря. Используя API данных DAS, вы утверждаете, что вы можете программно управлять резервированием (3) - манипулируя элементами документа низкого уровня. Вы могли бы заставить это работать, но я не думаю, что база данных резервирования была разработана с учетом этого.

Вот почему я думаю этот ответ - лучший вариант. Он использует автоматическую обработку (№ 2 выше) и избавляет вас от необходимости заниматься внутренним оформлением документов бронирования. Если вы используете этот подход, вы должны предоставить DAS Calendar API список attendees, например:

  "attendees":[
    {
      "role":"req-participant",
      "userType":"room",
      "status":"needs-action",
      "rsvp":true,
      "email":"room@mycorp.com"
    }
  ]

Другими словами, status должно быть "needs-action", а не "accepted", как показано в исходном сообщении. Также убедитесь, что вы используете правильный адрес электронной почты как для организатора, так и для целевой комнаты. В приведенном выше примере показан адрес комнаты в Интернет-стиле, но администраторы не всегда дают комнате адрес в Интернете.

...