square / square-nodejs-sdk

Other
89 stars 40 forks source link

Listing bookings fails with: The response did not match the response schema. #89

Closed chris-miner closed 2 years ago

chris-miner commented 2 years ago

I did the following:

  1. used the node.js sdk to list bookings for a given month.

Expected:

Found:

Here's the whole error message:

Error: The response did not match the response schema.

Some properties are missing in the object: "service_variation_id", "service_variation_version".

Given value: {"duration_minutes":60,"team_member_id":"WaNoY7Hn7J5czATdrqcn","any_team_member":false,"intermission_minutes":0}
Type: 'object'
Expected type: 'Lazy<Object<{durationMinutes,serviceVariationId,teamMemberId,serviceVariationVersion,intermissionMinutes,anyTeamMember,resourceIds}>>'
Path: bookings › 1 › appointment_segments › 0
app.js:128

Extra Info

As you can see the service_variation_id and service_variation_version aren't present. In this case I don't actually care since all I want to know about is times, dates, customer, staff, email, and phone info about the booking. The data in the system was put there via the appointments web interface, so I don't know why it is missing attributes.

My workaround, is to correct the data, but that only works for 'bad' bookings that haven't been canceled. If they have been canceled I can't edit them through the UI.

My other idea is to fetch the bookings one by one rather than in batch mode so I can skip over the ones that are causing a problem. That won't work since the fetch fails in a way that doesn't allow me to continue with a subsequent fetch with a new cursor value.

Conclusions

It shouldn't bomb out the way it does, especially since I am not responsible for the integrity of that data. I'm just a consumer of it.

wolfadex commented 2 years ago

Thank you for reporting this @chris-miner. We're looking into it and will get back to you.

chris-miner commented 2 years ago

To remedy the situation for myself, I commented out the relevant lines in node_modules/square/dist/square.cjs.development.js:

var appointmentSegmentSchema = /*#__PURE__*/schema.object({
  durationMinutes: ['duration_minutes', /*#__PURE__*/schema.number()],
  // serviceVariationId: ['service_variation_id', /*#__PURE__*/schema.string()],
  teamMemberId: ['team_member_id', /*#__PURE__*/schema.string()],
  // serviceVariationVersion: ['service_variation_version', /*#__PURE__*/schema.bigint()],
  intermissionMinutes: ['intermission_minutes', /*#__PURE__*/schema.optional( /*#__PURE__*/schema.number())],
  anyTeamMember: ['any_team_member', /*#__PURE__*/schema.optional( /*#__PURE__*/schema.boolean())],
  resourceIds: ['resource_ids', /*#__PURE__*/schema.optional( /*#__PURE__*/schema.array( /*#__PURE__*/schema.string()))]
});
wolfadex commented 2 years ago

This was caused by a discrepancy between what the back end was actually returning and what the back end specified it would return. The fix was made on the back end and no SDK changes are necessary.