Has anybody come across an issue with the V3 Calendar API where sometimes the Attendee data is returned empty even though there are valid attendees on an Event?
The Events always have valid attendees.
An Event Get returns Attendees = NULL
Here is a code snippet of an Event Query
calendarToolsV3 cv3 = new calendarToolsV3(true, calendar, int.Parse(organisationId));
EventsResource.GetRequest gr = new EventsResource.GetRequest(cv3.service, calendar, eventId);
gr.AlwaysIncludeEmail = true;
Event evv = gr.Execute();
litDiagnosis.Text = "Summary | " + evv.Summary + "<br/>";
litDiagnosis.Text += "Id | " + evv.Id + "<br/>";
litDiagnosis.Text += "RecurringEventId | " + evv.RecurringEventId + "<br/>";
litDiagnosis.Text += "Status | " + evv.Status + "<br/>";
litDiagnosis.Text += "Visibility | " + evv.Visibility + "<br/>";
litDiagnosis.Text += "Start | " + (evv.Start == null ? evv.Start.Date.ToString() : evv.Start.DateTime.ToString() + "<br/>");
if (evv.Attendees != null && evv.Attendees.Count() > 0)
{
foreach (EventAttendee ea in evv.Attendees)
{
litDiagnosis.Text += "Attendee | " + ea.Email + "|" + ea.ResponseStatus + "<br/>";
}
}
****** EDIT **************
I have done some further testing and it seems that this occurs where the original APPT is a recurring APPT.
The user that I am interrogating the Event with has declined the Event
The attendees are no longer visible to that user.
The attendees are however visible to the Creator of the Event. When the Event is deleted the Attendees become visible again to that user?
When the Event is not Recurring this behaviour is not observed and all users can view all Attendees even when declined/deleted?
*********************** EXAMPLE CAPTURE FROM API EXPLORER ***************
Event Created by admin#i3000.co. Attendee Lisa.Jones#i3000.co queries the Event and can see the Attendess
{
"kind": "calendar#event",
"etag": "\"2869345662384000\"",
"id": "7d3pmni42o6pg6taeudsskhfh8",
"status": "confirmed",
"htmlLink": "https://www.google.com/calendar/event?eid=N2QzcG1uaTQybzZwZzZ0YWV1ZHNza2hmaDhfMjAxNTA2MTlUMjIwMDAwWiBsaXNhLmpvbmVzQGkzMDAwLmNv",
"created": "2015-06-19T00:13:22.000Z",
"updated": "2015-06-19T00:13:51.192Z",
"summary": "ATTENDEE TEST",
"colorId": "11",
"creator": {
"email": "admin#i3000.co",
"displayName": "Admin User"
},
"organizer": {
"email": "admin#i3000.co",
"displayName": "Admin User"
},
"start": {
"dateTime": "2015-06-20T08:00:00+10:00",
"timeZone": "America/New_York"
},
"end": {
"dateTime": "2015-06-20T09:00:00+10:00",
"timeZone": "America/New_York"
},
"recurrence": [
"RRULE:FREQ=WEEKLY;COUNT=2;BYDAY=FR"
],
"iCalUID": "7d3pmni42o6pg6taeudsskhfh8#google.com",
"sequence": 0,
"attendees": [
{
"email": "admin#i3000.co",
"displayName": "Admin User",
"organizer": true,
"responseStatus": "accepted"
},
{
"email": "lisa.jones#i3000.co",
"displayName": "lisa jones",
"self": true,
"responseStatus": "needsAction"
}
],
"extendedProperties": {
"private": {
"ilink": "recur7d3pmni42o6pg6taeudsskhfh8"
}
},
"hangoutLink": "https://plus.google.com/hangouts/_/i3000.co/admin-lisa-jone?hceid=YWRtaW5AaTMwMDAuY28.7d3pmni42o6pg6taeudsskhfh8",
"reminders": {
"useDefault": true
}
}
Lisa.Jones Removes the Event from her Calendar and Queries again - Attendees are not Visible
{
"kind": "calendar#event",
"etag": "\"2869346050176000\"",
"id": "7d3pmni42o6pg6taeudsskhfh8",
"status": "cancelled",
"htmlLink": "https://www.google.com/calendar/event?eid=N2QzcG1uaTQybzZwZzZ0YWV1ZHNza2hmaDhfMjAxNTA2MTlUMjIwMDAwWiBsaXNhLmpvbmVzQGkzMDAwLmNv",
"created": "2015-06-19T00:13:22.000Z",
"updated": "2015-06-19T00:17:05.088Z",
"summary": "ATTENDEE TEST",
"colorId": "11",
"creator": {
"email": "admin#i3000.co",
"displayName": "Admin User"
},
"organizer": {
"email": "admin#i3000.co",
"displayName": "Admin User"
},
"start": {
"dateTime": "2015-06-20T08:00:00+10:00",
"timeZone": "America/New_York"
},
"end": {
"dateTime": "2015-06-20T09:00:00+10:00",
"timeZone": "America/New_York"
},
"recurrence": [
"RRULE:FREQ=WEEKLY;COUNT=2;BYDAY=FR"
],
"iCalUID": "7d3pmni42o6pg6taeudsskhfh8#google.com",
"sequence": 0,
"extendedProperties": {
"private": {
"ilink": "recur7d3pmni42o6pg6taeudsskhfh8"
}
},
"hangoutLink": "https://plus.google.com/hangouts/_/i3000.co/admin-lisa-jone?hceid=YWRtaW5AaTMwMDAuY28.7d3pmni42o6pg6taeudsskhfh8",
"reminders": {
"useDefault": true
}
}
Admin#i3000.co now deletes the Event. When Lisa.Jones Queries the Event the Attendees are again visible
{
"kind": "calendar#event",
"etag": "\"2869346122438000\"",
"id": "7d3pmni42o6pg6taeudsskhfh8",
"status": "cancelled",
"htmlLink": "https://www.google.com/calendar/event?eid=N2QzcG1uaTQybzZwZzZ0YWV1ZHNza2hmaDhfMjAxNTA2MTlUMjIwMDAwWiBsaXNhLmpvbmVzQGkzMDAwLmNv",
"created": "2015-06-19T00:13:22.000Z",
"updated": "2015-06-19T00:17:41.219Z",
"summary": "ATTENDEE TEST",
"colorId": "11",
"creator": {
"email": "admin#i3000.co",
"displayName": "Admin User"
},
"organizer": {
"email": "admin#i3000.co",
"displayName": "Admin User"
},
"start": {
"dateTime": "2015-06-20T08:00:00+10:00",
"timeZone": "America/New_York"
},
"end": {
"dateTime": "2015-06-20T09:00:00+10:00",
"timeZone": "America/New_York"
},
"recurrence": [
"RRULE:FREQ=WEEKLY;COUNT=2;BYDAY=FR"
],
"iCalUID": "7d3pmni42o6pg6taeudsskhfh8#google.com",
"sequence": 1,
"attendees": [
{
"email": "lisa.jones#i3000.co",
"displayName": "lisa jones",
"self": true,
"responseStatus": "needsAction"
},
{
"email": "admin#i3000.co",
"displayName": "Admin User",
"organizer": true,
"responseStatus": "accepted"
}
],
"extendedProperties": {
"private": {
"ilink": "recur7d3pmni42o6pg6taeudsskhfh8"
}
},
"hangoutLink": "https://plus.google.com/hangouts/_/i3000.co/admin-lisa-jone?hceid=YWRtaW5AaTMwMDAuY28.7d3pmni42o6pg6taeudsskhfh8",
"reminders": {
"useDefault": true
}
}
Related
Checking the BFM v4 Rest API docs we find that we can set a 'ResponseType' field to decide how the response will be formatted.
However, when testing this in Postman, we found some oddities. A request with the following Body to the endpoint /v4/offers/shop:
{
"OTA_AirLowFareSearchRQ": {
"POS": {
"Source": [
{
"PseudoCityCode": "{{pcc}}",
"RequestorID": {
"ID": "1",
"Type": "1",
"CompanyName": {
"Code": "TN",
"CodeContext": "TN"
}
}
}
]
},
"OriginDestinationInformation": [
{
"TPA_Extensions": {
"SegmentType": { "Code": "O"}
},
"RPH": "1",
"Fixed": false,
"DepartureDateTime": "{{start_date}}T11:00:00",
"OriginLocation": {
"AllAirports": false,
"LocationCode": "MIA",
"CodeContext": "IATA"
},
"DestinationLocation": {
"AllAirports": false,
"LocationCode": "MCO",
"CodeContext": "IATA"
}
}
],
"TravelPreferences": {
"CabinPref": [
{
"Cabin": "Y",
"PreferLevel": "Preferred"
}
],
"LookForAlternatives": false,
"TPA_Extensions": {
"TripType": { "Value": "OneWay" },
"JumpCabinLogic": { "Disabled": false },
"KeepSameCabin": { "Enabled": true },
"DiversityParameters": {
"AdditionalNonStopsNumber": 30
},
"ExcludeVendorPref": [
{
"Code": "G3"
}
]
},
"ETicketDesired": false,
"Hybrid": true,
"ValidInterlineTicket": true
},
"TravelerInfoSummary": {
"AirTravelerAvail": [
{
"PassengerTypeQuantity": [
{
"Code": "ADT",
"Quantity": 1,
"TPA_Extensions": {
"VoluntaryChanges": {
"Match": "Any"
}
}
}
]
}
],
"PriceRequestInformation": {
"NegotiatedFareCode": [],
"AccountCode": [{ "Code": "PROMAO" }],
"CurrencyCode": "BRL",
"TPA_Extensions": {
"BrandedFareIndicators": {
"SingleBrandedFare": true,
"MultipleBrandedFares": true
},
"Indicators": {
"MinMaxStay": { "Ind": true },
"RefundPenalty": { "Ind": true },
"ResTicketing": { "Ind": true }
},
"Priority": {
"Price": { "Priority": 1 },
"DirectFlights": { "Priority": 2 },
"Time": { "Priority": 3 },
"Vendor": { "Priority": 4 }
}
}
}
},
"TPA_Extensions": {
"IntelliSellTransaction": {
"RequestType": { "Name": "50ITINS" },
"CompressResponse": {
"Value": false
}
},
"AlternateAirportMileage": {
"Number": "25"
}
},
"DirectFlightsOnly": false,
"ResponseType": "OTA",
"SeparateMessages": false,
"Version": "v4"
}
}
produces a response in the GroupedItineraries format ("GIR" value), which is an undesired behavior for us.
Weirdly, the API accepts any string to this field 'ResponseType', not indicating any misuse, but always returning the GroupedItineraries format. The response contains the following messages:
{
"groupedItineraryResponse": {
"version": "6.5.2",
"messages": [
{
"severity": "Info",
"type": "SERVER",
"code": "ASE032LPSCIL549.ATSE.CERT.ASCINT.SABRECIRRUS.COM",
"text": "27138"
},
{
"severity": "Info",
"type": "WORKERTHREAD",
"code": "TRANSACTIONID",
"text": "7100110708344235563"
},
{
"severity": "Info",
"type": "DRE",
"code": "RULEID",
"text": "18411"
},
{
"severity": "Info",
"type": "DEFAULT",
"code": "RULEID",
"text": "25916"
},
{
"severity": "Info",
"type": "SCHEDULES",
"code": "MSG",
"text": "NO FLIGHT SCHEDULES FOR JOURNEY 2022-06-24 [FLL]-[ISM]"
},
{
"severity": "Info",
"type": "SCHEDULES",
"code": "MSG",
"text": "NO FLIGHT SCHEDULES FOR JOURNEY 2022-06-24 [MIA]-[ISM]"
},
{
"severity": "Info",
"type": "SCHEDULES",
"code": "MSG",
"text": "NO FLIGHT SCHEDULES FOR JOURNEY 2022-06-24 [OPF]-[ISM]"
},
{
"severity": "Info",
"type": "SCHEDULES",
"code": "MSG",
"text": "NO FLIGHT SCHEDULES FOR JOURNEY 2022-06-24 [OPF]-[MCO]"
},
{
"severity": "Info",
"type": "SCHEDULES",
"code": "MSG",
"text": "NO FLIGHT SCHEDULES FOR JOURNEY 2022-06-24 [OPF]-[ORL]"
},
{
"severity": "Info",
"type": "SCHEDULES",
"code": "MSG",
"text": "NO FLIGHT SCHEDULES FOR JOURNEY 2022-06-24 [TMB]-[ISM]"
},
{
"severity": "Info",
"type": "SCHEDULES",
"code": "MSG",
"text": "NO FLIGHT SCHEDULES FOR JOURNEY 2022-06-24 [TMB]-[MCO]"
},
{
"severity": "Info",
"type": "SCHEDULES",
"code": "MSG",
"text": "NO FLIGHT SCHEDULES FOR JOURNEY 2022-06-24 [TMB]-[ORL]"
}
] ...
Informing that there's no support for OTA using REST, the REST service answers will always be on GIR format.
Best regards.
My Stepfunction is supposed to check whether an item exist in the dynamo. if it does, it needs to generate the presigned url, otherwise it has to update the dynamodb item.
When it matches the item, it works as expected where as it fails when dynamo getitem output is null fails with states.runtime error. It does not going through catch statement. appreciate any help.
Here is my code.
{ "Comment": "A Hello World example of the Amazon States Language using Pass states", "StartAt": "Hello", "States": {
"Hello": {
"Type": "Pass",
"Next": "Verify item from DynamoDB"
},
"s3_url": {
"Type": "Pass",
"Result": "Hello",
"End": true
},
"Verify item from DynamoDB": {
"Type": "Task",
"Resource": "arn:aws:states:::dynamodb:getItem",
"Parameters": {
"TableName": "s3_table",
"Key": {
"etag": {
"S.$": "$.Records[0].s3.object.eTag"
}
}
},
"ResultPath": "$.DynamoDB",
"OutputPath": "$.DynamoDB.Item",
"Next": "s3_url",
"Catch": [
{
"ErrorEquals": [
"States.Runtime"
],
"Next": "DynamoDB Update"
}
]
},
"DynamoDB Update": {
"Type": "Task",
"Resource": "arn:aws:states:::dynamodb:putItem",
"Parameters": {
"TableName": "s3_table",
"Item": {
"etag": {
"S.$": "$.eTag"
},
"filekey": {
"S": "mp3Files"
}
}
},
"End": true
} } }
solved this using choice state. Open to hear any suggestions on Catch state.
Here is the code.
{
"Comment": "A Hello World example of the Amazon States Language using Pass states",
"StartAt": "Hello",
"States": {
"Hello": {
"Type": "Pass",
"Next": "Verify item from DynamoDB"
},
"s3_url": {
"Type": "Pass",
"Result": "Hello",
"End": true
},
"Verify item from DynamoDB": {
"Type": "Task",
"Resource": "arn:aws:states:::dynamodb:getItem",
"Parameters": {
"TableName": "s3_table",
"Key": {
"etag": {
"S.$": "$.Records[0].s3.object.eTag"
}
}
},
"ResultPath": "$.Records[0].DynamoDB",
"OutputPath": "$",
"Next": "Choice State",
"Catch": [
{
"ErrorEquals": [
"States.Runtime"
],
"Next": "DynamoDB Update"
}
]
},
"Choice State": {
"Type": "Choice",
"Choices": [
{
"Variable": "$.Records[0].DynamoDB.Item.etag.S",
"IsPresent": true,
"Next": "s3_url"
}
],
"Default": "DynamoDB Update"
},
"DynamoDB Update": {
"Type": "Task",
"Resource": "arn:aws:states:::dynamodb:putItem",
"Parameters": {
"TableName": "s3_table",
"Item": {
"etag": {
"S.$": "$.Records[0].s3.object.eTag"
},
"filekey": {
"S.$": "$.Records[0].s3.object.key"
}
}
},
"End": true
}
}
}
In Slack message blocks, when adding a button, the confirmation dialog text is supposed to support markdown.
https://api.slack.com/reference/block-kit/composition-objects#text
But it just displays plain text:
{
"blocks": [
{
"type": "section",
"accessory": {
"type": "button",
"text": {
"type": "plain_text",
"text": "Validate"
},
"confirm":{
"title": {
"type": "plain_text",
"text": "Details"
},
"text": {
"type": "mrkdwn",
"text": "*bold* ?"
},
"confirm": {
"type": "plain_text",
"text": "Ok"
}
}
},
"text": {
"type": "mrkdwn",
"text": "Hello World!"
}
}
]
}
this seems to work
{
"type": "modal",
"title": {
"type": "plain_text",
"text": "My App",
"emoji": true
},
"submit": {
"type": "plain_text",
"text": "Submit",
"emoji": true
},
"close": {
"type": "plain_text",
"text": "Cancel",
"emoji": true
},
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "This is a mrkdwn section block :ghost: *this is bold*, and ~this is crossed out~, and <https://google.com|this is a link>"
}
}
]
}
I faced the same issue so I reached out to Slack's support, and they confirmed it is a known bug. They have no ETA for the fix yet.
Is this a valid scenario or a bug? Both the events are copied below.
{
"#odata.etag": "W/\"xyy/ioMMpU+5PhLPRGcb5AAAHWKktw==\"",
"id": "AAMkADZlNDUzMDYxLTQ2OTEtNDNiOC1hMDNhLTY1ZjAyMTYwZTBkOQBGAAAAAACPfBk217UgTYo6zKN7dzZsBwDHLL_KgwylT7k_Es9EZxvkAAAAAAENAADHLL_KgwylT7k_Es9EZxvkAAAdZ_YbAAA=",
"subject": "TestUtilityRunNow7_51",
"bodyPreview": "",
"body": {
"contentType": "html",
"content": "\r\n\r\n\r\n\r\n \r\n\r\n\r\n"
},
"start": {
"dateTime": "2019-03-08T12:57:15.0000000",
"timeZone": "UTC"
},
"end": {
"dateTime": "2019-03-08T13:02:15.0000000",
"timeZone": "UTC"
},
"location": {
"displayName": "",
"locationType": "default",
"uniqueIdType": "unknown",
"address": {},
"coordinates": {}
},
"attendees": [
{
"type": "resource",
"status": {
"response": "none",
"time": "0001-01-01T00:00:00Z"
},
"emailAddress": {
"name": "Training Room",
"address": "trainingroom#wmexchangeid.onmicrosoft.com"
}
}
],
"organizer": {
"emailAddress": {
"name": "Ravinder Singh Chahal",
"address": "ravindersingh.chahal#wmexchangeid.onmicrosoft.com"
}
}
}
{
"#odata.etag": "W/\"xyy/ioMMpU+5PhLPRGcb5AAAHWKiVA==\"",
"id": "AAMkADZlNDUzMDYxLTQ2OTEtNDNiOC1hMDNhLTY1ZjAyMTYwZTBkOQBGAAAAAACPfBk217UgTYo6zKN7dzZsBwDHLL_KgwylT7k_Es9EZxvkAAAAAAENAADHLL_KgwylT7k_Es9EZxvkAAAdZ_YBAAA=",
"subject": "TestUtilityRunNow7_25",
"bodyPreview": "",
"body": {
"contentType": "html",
"content": "\r\n\r\n\r\n\r\n \r\n\r\n\r\n"
},
"start": {
"dateTime": "2019-03-08T12:30:59.0000000",
"timeZone": "UTC"
},
"end": {
"dateTime": "2019-03-08T12:35:59.0000000",
"timeZone": "UTC"
},
"location": {
"displayName": "",
"locationType": "default",
"uniqueIdType": "unknown",
"address": {},
"coordinates": {}
},
"attendees": [
{
"type": "resource",
"status": {
"response": "none",
"time": "0001-01-01T00:00:00Z"
},
"emailAddress": {
"name": "Training Room",
"address": "trainingroom#wmexchangeid.onmicrosoft.com"
}
}
],
"organizer": {
"emailAddress": {
"name": "Ravinder Singh Chahal",
"address": "ravindersingh.chahal#wmexchangeid.onmicrosoft.com"
}
}
}
PingFederate 8.2.2 is used for our systems.All the REST APIs to create PF objects are automated but /sp/adapter(https://pfhost:9999/pf-admin-api/v1/sp/adapters) is not working using the below JSON .Manually If I create the same configuration it works.The below mentioned JSON is retrieved from already manually created /sp/adapter.But when I use the same JSON in API call which says error as below, please help to solve this problem.
ERROR:
{
"resultId": "validation_error",
"message": "Validation error(s) occurred. Please review the error(s) and address accordingly.",
"validationErrors": [
{
"message": "'' is not a valid selection for 'Send Extended Attributes'",
"fieldPath": "configuration.fields[21].value",
"errorId": "plugin_validation_error"
}
]
}
JSON:
{
"id": "opentokenadapt1",
"name": "opentokenadapt1",
"pluginDescriptorRef": {
"id": "com.pingidentity.adapters.opentoken.SpAuthnAdapter"
},
"configuration": {
"tables": [],
"fields": [
{
"name": "Password",
"value": "Password123"
},
{
"name": "Confirm Password",
"value": "Password123"
},
{
"name": "Transport Mode",
"value": "2"
},
{
"name": "Token Name",
"value": "opentoken"
},
{
"name": "Cipher Suite",
"value": "2"
},
{
"name": "Authentication Service",
"value": ""
},
{
"name": "Account Link Service",
"value": ""
},
{
"name": "Logout Service",
"value": ""
},
{
"name": "Cookie Domain",
"value": ""
},
{
"name": "Cookie Path",
"value": "/"
},
{
"name": "Token Lifetime",
"value": "300"
},
{
"name": "Session Lifetime",
"value": "43200"
},
{
"name": "Not Before Tolerance",
"value": "0"
},
{
"name": "Force SunJCE Provider",
"value": "false"
},
{
"name": "Use Verbose Error Messages",
"value": "false"
},
{
"name": "Obfuscate Password",
"value": "true"
},
{
"name": "Session Cookie",
"value": "false"
},
{
"name": "Secure Cookie",
"value": "false"
},
{
"name": "HTTP Only Flag",
"value": "true"
},
{
"name": "Send Subject as Query Parameter",
"value": ""
},
{
"name": "Subject Query Parameter ",
"value": ""
},
{
"name": "Send Extended Attributes",
"value": ""
},
{
"name": "Skip Trimming of Trailing Backslashes",
"value": "false"
}
]
},
"attributeContract": {
"coreAttributes": [
{
"name": "subject"
}
],
"extendedAttributes": [
{
"name": "nsroles"
}
]
}
}
"Send Extended Attributes" needs a valid value (not the empty string you've given it). The possible values are "0" (None), "1" (Cookies) or "2" (Query Parameters).
One tip in trying to narrow these issues down: try building the SP adapter instance in the PingFederate administrative console (UI) then compare it with the JSON model you GET from the API.