Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Initial meeting doc #74

Open
wants to merge 9 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Whats_New.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ Keep up to date on what’s new in IBM Watson Work Services. We’ll list the la

| Date | What’s new |
| ------------- |:-------------|
| 12.Oct.2018 | Added [meeting API](./guides/V1_wwsg_Meetings.md). |
| 07.Sep.2018 | Graduated [Templates](./guides/Creating_Solutions.md) from `EXPERIMENTAL` to `BETA` |
| 11.Jul.2018 | Published [message reactions](./guides/V1_wwsg_Reactions.md). |
| 11.Jul.2018 | Published [message deletion](./guides/V1_delete_message.md). |
Expand Down
50 changes: 50 additions & 0 deletions guides/V1_Get_Public_Meeting.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
---
copyright: 'Copyright IBM Corp. 2018'
link: 'get-public-meeting'
is: 'experimental'
---
# Get Public Meeting Details

This REST GET request allows the API caller to get details about a public meeting.

### Version information
- Version: 1.0.0

### URI scheme
_Host_ : **api.watsonwork.ibm.com**
_Scheme_: **HTTPS**

### Path
```
GET v1/publicMeeting/bySpaceId/<spaceId>
```

#### Responses

|HTTP Code|Description|Schema|
|---|---|---|
|**200**|The meeting data returned.|MeetingData(see below)|


#### Produces

* `application/json`


<a name="meetingdata"></a>

#### MeetingData
Entity that represents the requested meeting.

|Name|Description|Schema|
|---|---|---|
|**meetingId** <br>*required*|Id of the meeting.|string|
|**meetingNumber** <br>*optional*|The Zoom meeting number if the meeting is currently active or otherwise null.|string|
|**password** <br>*optional*|The Zoom meeting password if the meeting is currently active or otherwise null.|string|
|**active** <br>*required*|Boolean representing whether the meeting is currently active.|string|
|**allowPublic** <br>*required*|Boolean representing whether the meeting open to the public.|string|
|**startTime** <br>*optional*|Start time of the active meeting or otherwise null.|string|
|**meetingProviderJoinUrl** <br>*optional*|A URL to join the meeting with the Zoom client or otherwise null.|string|
|**meetingProviderJoinUrl** <br>*optional*|A URL to join the meeting with the Zoom client or otherwise null.|string|
|**pstnPasscode** <br>*optional*|The PSTN passcode of the active meeting if present or otherwise null.|string|
|**dialInNumbers** <br>*optional*|An array of country code identifier plus dial-in number forthe active meeting or otherwise null.|string|
147 changes: 147 additions & 0 deletions guides/V1_Meeting.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,147 @@
---
copyright: 'Copyright IBM Corp. 2018'
link: 'meeting'
is: 'experimental'
---

# Get meeting details

## Concepts

The _meeting_ query allows the API caller to get details about the meeting. The query accepts either a Space ID (spaceId) or a meeting ID (id) and will return meeting details if the calling user has access to the meeting. The calling user will have access to the meeting if the user has access to the space which contains the meeting, or the meeting has been marked to allow public participants.

## Schema

### Meeting Query


```graphql
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The other guides use a tabular format. Most guides cover the documentation of a single type in the schema, though in the case of the moments doc, we used section headers per type with a table within each. The new fields on existing types, like the meeting field on QueryRoot, might be best demonstrated in a subset in the nav with an example?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I followed the example of Reactions (like guides/V1_Reacting_Users.md) because I think it was what Miguel pointed me to. The Reactions doc used GraphQL type definition language instead of tables. I'm fine either way, but will hold off on changes unless you strongly disagree.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK - I think that reactions guide isn't published into the nav yet @miguelestrada and most of the guides already in the nav use a more tabular format?

If we want something in this GraphQL type format - I think we should just generate it in the GraphQL server itself. This is also not too different from what you actually already see in the sidebar of the GraphQL explorer, so not sure there is huge value in copying this here into a doc we need to update separately? I think the doc gives us the opportunity to say more about each field we add, and I'm not sure the graphql type language really allows us to do that.

I'm 100% for using these type definitions in our internal designs and specs, but I don't know if redundantly adding these into the doc when you can find something similar in the GraphQL explorer, is helpful.

One other thing we could explore in the future though - we could try to make the GraphQL explorer tool responsive to URLs that could open the doc sidebar to a specific type. Then we could make the type names clickable links perhaps and avoid redefining things here.

type QueryRoot {
...
meeting(spaceId: ID, id: ID): Meeting
}

type MeetingRecording {
url: String!
startTime: Date
stopTime: Date
}

type DialInNumber {
countryCode: String!
number: String!
}

type JoinInfo {
allowPublic: Boolean!
meetingNumber: String
meetingProviderJoinUrl: String
password: String
hostKey: String!
pstnPasscode: String
webJoinToken: String!
dialInNumbers : [DialInNumber]
}

type Meeting {
id: ID!
active: Boolean!
allowPublic: Boolean!
startTime: Date
endTime: Date
description: String
recordings: [MeetingRecording]
activeParticipants: PersonCollection
attendees: PersonCollection
space: Space!
startedBy: Person
message: Message
joinInfo: JoinInfo
}

```

## Field definitions

# MeetingRecording
|Name|Description|Schema|
|---|---|---|---|
|**url**|The URL pointing to the meeting recording MP4 file.|**String** <br>_required_|
|**startTime** |The start date/time of the meeting recording |**Date**|
|**stopTime** |The stop date/time of the meeting recording |**Date**|


# DialInNumber
|Name|Description|Schema|
|---|---|---|---|
|**countryCode**|Two character country code where the number resides|**String** <br>_required_|
|**number**|E.164 phone number which can be used to dial into the meeting|**String** <br>_required_|

# JoinInfo
|Name|Description|Schema|
|---|---|---|---|
|**allowPublic** |Whether the meeting can be joined by non-members of the space|**Boolean** <br>_required_|
|**meetingNumber**|If a meeting is active, the a string of digits representing the Zoom meeting|**String** <br>_required_|
|**meetingProviderJoinUrl**|A URL which can be used to directly joint he meeting in a browser|**String** <br>_required_|
|**password** |If a meeting is active, the password required to join the Zoom meeting|**String**|
|**hostKey** |If a meeting is active and there is no current host, the host key required to claim host.|**String**|
|**pstnPasscode**|If required, the DTMF digits necessary to join a meeting via a phone dial in|**String**|
|**webJoinToken** |If a meeting is active, the token required to join via the web client.|**String** <br>_required_|
|**dialInNumbers**|An array of DialInNumber objects|** DialInNumber** array|

# Meeting
|Name|Description|Schema|
|---|---|---|---|
|**id**|ID of the meeting|**String** <br>_required_|
|**active**|Whether the meeting is currently active|**Boolean** <br>_required_|
|**allowPublic** |Whether the meeting can be joined by non-members of the space|**Boolean** <br>_required_|
|**startTime** |The start date/time of the meeting |**Date**|
|**endTime** |The date/time the meeting ended |**Date**|
|**description**|A description for the meeting|**String**|
|**recordings**|An array of MeetingRecording objects. A new MeetingRecording is created each time a cloud recording is started in the meeting.|** MeetingRecording** array|
|**activeParticipants**|If a meeting is active, a PersonCollection representing the current Workspace users.|**PersonCollection**|
|**attendeesParticipants**|A PersonCollection representing the Workspace users who have attended the meeting.|**PersonCollection**|
|**space** |The Space where the meeting was held.|**Space** <br>_required_|
|**message** |A Message representing where in the Space transcript the meeting occurred. |**Message**|
|**joinInfo** |If a meeting is active, the details required to join the meeting |**JoinInfo**|



## Example Request

~~~~
Method: POST
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In the other guides we use a link to the GraphQL tool to show queries like this - so you can just copy/paste the query into the tool, then grab the URL from the tool. You will need apiType=experimental on the URL for this one. I was recently doing the moments doc in a similar way if you want to check it out.

URL: https://api.watsonwork.ibm.com/graphql
Headers: 'Content-Type: application/graphql' , 'x-graphql-view: PUBLIC, EXPERIMENTAL'
Body:
{
query {
meeting(spaceId: "space-id") {
active
joinInfo {
meetingNumber
password
meetingProviderJoinUrl
}
}
}
}
~~~~
## Example Result

~~~~
{
"data": {
"meeting": {
"active": true,
"joinInfo": {
"password": "235253938",
"password": "53621872",
"meetingProviderJoinUrl": "https://zoom.us/j/235253938?pwd=vBRBlZBaXAKwIumekTziMw"
}
}
}
}
~~~~

Try it out with our GraphQL tool - <a href="https://developer.watsonwork.ibm.com/tools/graphql?apiType=experimental&query=query%20getMeetingBySpaceId%20{%20%20meeting(spaceId:%20%22space-id%22)%20{%20%20%20%20startTime%20%20%20%20active%20%20%20%20allowPublic}}" target="_blank">Get a meeting by space-id</a>
73 changes: 73 additions & 0 deletions guides/V1_Start_Meeting.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
---
copyright: 'Copyright IBM Corp. 2018'
link: 'start-meeting'
is: 'experimental'
---

# Start a meeting within a space

## Concepts

The _startMeeting_ mutation allows the API caller to start a meeting with a **space**. The mutation accepts a Space ID (spaceId) as an argument, and makes the request on behalf of the caller, starting a meeting within the specified space. The result will reflect the whether the call was accepted for processing by the service.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can the JWT used on this API call be that of an appID as identity and as client or does it expect a person as the identity?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good question. The back-end implementation doesn't care provided the identity represented by the JWT token has the proper permission: meeting_host I don't know if an app can be assigned that permission, or if there are gaps around that.


## Schema

### Start Meeting Mutation



```graphql
type MutationRoot {
...
startMeeting(input: StartMeetingInput!): MeetingMutationOutput
}

type StartMeetingInput {
spaceId: ID!
}

type MeetingMutationOutput {
accepted: Boolean!
}
```

## Field definitions

# StartMeetingInput
|Name|Description|Schema|
|---|---|---|---|
|**spaceId**|Space ID of the space in which to start a meeting|**String** <br>_required_|

# MeetingMutationOutput
|Name|Description|Schema|
|---|---|---|---|
|**accepted**|Whether the request to start a meeting was accepted for processing|**Boolean** <br>_required_|

## Example Request

~~~~
Method: POST
URL: https://api.watsonwork.ibm.com/graphql
Headers: 'Content-Type: application/graphql' , 'x-graphql-view: PUBLIC, EXPERIMENTAL'
Body:
{
mutation {
startMeeting(input: {spaceId : "5ad0fabfe4b078066d690a24"}) {
accepted
}
}
}
~~~~
## Example Result

~~~~
{
"data": {
"startMeeting": {
"accepted": "true"
}
}
}
~~~~

Try it out with our GraphQL tool - <a href="https://developer.watsonwork.ibm.com/tools/graphql?apiType=experimental&query=mutation%20startMeeting%20{%20%20startMeeting(input: {spaceId:%20%22space-id%22})%20{%20%20%20%20accepted%20%20}}" target="_blank">Start a meeting</a>
75 changes: 75 additions & 0 deletions guides/V1_Update_Meeting_Settings.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
---
copyright: 'Copyright IBM Corp. 2018'
link: 'update-meeting-settings'
is: 'experimental'
---

# Update a meeting

## Concepts

The _updateMeetingSettings_ mutation allows the API caller to configure options on the meeting. The mutation accepts a Space ID (spaceId), and an allowPublic boolean as arguments, and makes the request on behalf of the caller, updating the meeting within the specified space. The result will reflect the whether the call was accepted for processing by the service.

## Schema

### Update Meeting Settings Mutation



```graphql
type MutationRoot {
...
updateMeetingSettings(input: UpdateMeetingSettingsInput!): MeetingSettingsMutationOutput
}

type UpdateMeetingSettingsInput {
spaceId: ID!
allowPublic: Boolean!
}

type MeetingSettingsMutationOutput {
accepted: Boolean!
}
```
## Field definitions

# UpdateMeetingSettingsInput
|Name|Description|Schema|
|---|---|---|---|
|**spaceId**|Space ID of the space for which the meeting should be updated|**String** <br>_required_|
|**allowPublic**|Whether or not non-space members can join meetings started in the space|**Boolean** <br>_required_|

# MeetingSettingsMutationOutput
|Name|Description|Schema|
|---|---|---|---|
|**accepted**|Whether the request to update the meeting was accepted for processing|**Boolean** <br>_required_|


## Example Request

~~~~
Method: POST
URL: https://api.watsonwork.ibm.com/graphql
Headers: 'Content-Type: application/graphql' , 'x-graphql-view: PUBLIC, EXPERIMENTAL'
Body:
{
mutation {
updateMeetingSettings(input: {spaceId : "5ad0fabfe4b078066d690a24", allowPublic: true}) {
accepted
}
}
}
~~~~
## Example Result

~~~~
{
"data": {
"updateMeetingSettings": {
"accepted": "true"
}
}
}
~~~~

Try it out with our GraphQL tool - <a href="https://developer.watsonwork.ibm.com/tools/graphql?apiType=experimental&query=mutation%20updateMeetingSettings%20{%20%20updateMeetingSettings(input: {spaceId:%20%22space-id%22,%20allowPublic:%20true})%20{%20%20%20%20accepted%20%20}}" target="_blank">Update meeting settings</a>
1 change: 1 addition & 0 deletions guides/V1_spaces_main.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,3 +23,4 @@ Watson Work Services represents a Space with this object.
| members(before: String, after: String, first: Int, last: Int) | PersonCollection | The members of this space provided as a PersonCollection
| membersUpdated | Date | The date the membership was updated |
| conversation |Conversation | The conversation object for this space |
| activeMeeting | JoinInfo | Indicates that there is a meeting active within this space and includes the necessary information to join the meeting. This requires the `EXPERIMENTAL` value in `x-graphql-view header`. |
26 changes: 26 additions & 0 deletions guides/V1_wwsg_Meetings.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
---
copyright: 'Copyright IBM Corp. 2018'
link: 'meetings-overview'
is: 'experimental'
---
## Meetings Overview

Watson Work Services provides a set of **meeting** APIs for callers to start and get details about meetings. Meetings are online collaboration sessions which allow users to communicate with one another using the Workspace client, Zoom client, or a basic telephone. Meetings include audio, video, screensharing, and whiteboarding. Meetings happen within the context of a **space** and can either be restricted to only members of that space, or can be opened to public access so you can meet with people outside of your team or company.

### External APIs

* GraphQL mutation for starting a meeting
* **startMeeting** [Start a meeting within a space](https://github.com/watsonwork/watsonwork-developer-docs/blob/master/guides/V1_Start_Meeting.md)
<br>
* GraphQL mutation for updating a meeting
* **updateMeeting** [Update a meeting](https://github.com/watsonwork/watsonwork-developer-docs/blob/master/guides/V1_Update_Meeting.md)
<br>
* GraphQL query for meeting details
* **meeting** [Get information about the meeting](https://github.com/watsonwork/watsonwork-developer-docs/blob/master/guides/V1_Meeting.md)
<br>
* GraphQL query for getting an active meeting within a space
* **Space.activeMeeting** [Optional inclusion of activeMeeting on a space](https://github.com/watsonwork/watsonwork-developer-docs/blob/master/guides/V1_spaces_main.md)
<br>
* REST request for getting details of a public meeting
* **/api/v1/publicMeeting/bySpaceId/** [Get information about a public meeting](https://github.com/watsonwork/watsonwork-developer-docs/blob/master/guides/V1_Get_Public_Meeting.md)
<br>