npm package: @simpleview/sv-booking-client
Description: Client for communicating with sv-booking
Author: Colin Booen
Latest version: 1.4.0

# sv-booking-client

Client for communicating with the `sv-booking` GraphQL system.

It is build in JavaScript and has one peer dependency of `@simpleview/sv-graphql-client`.

## OS Support

The expectation is that this application will be installed in Linux using [sv-kubernetes](https://github.com/simpleviewinc/sv-kubernetes/).

## Prerequisites

* [sv-graphql-client](https://github.com/simpleviewinc/sv-graphql-client/)

## Install

Using npm:
```bash
npm install @simpleview/sv-booking-client
```

Using yarn:
```bash
yarn install @simpleview/sv-booking-client
```

## Update

To update to the latest version, rerun the install command.

## Authentication Requirements

Interactions with `sv-booking` mutations require authentication as a Simpleview user.

Use a Google Service Account when interacting with the service on behalf of a product.

```js
const { AuthPrefix } = require("@simpleview/sv-auth-client");
const { GraphServer } = require("@simpleview/sv-graphql-client");

async function serviceAccountToken() {
	const service_account = JSON.parse(SERVICE_ACCOUNT_JSON);

	const { auth } = new GraphServer({
		graphUrl: AUTH_GRAPHQL_URL,
		prefixes: [AuthPrefix]
	});

	// authorize the service_account return the token
	const { token } = await auth.login_service_account({
		input: {
			email: service_account.client_email,
			private_key: service_account.private_key
		},
		fields: `
			success
			token
		`
	});

	return token;
}
```

The `token` should be added to the `context` for each mutation function call.

## Implementation & Usage

To see the input parameters and output fields of an endpoint, view the Schema in the GraphQL Explorer at https://graphql.simpleviewinc.com/ for the corresponding GraphQL query.

## BookingPrefix

`BookingPrefix` can be loaded into the `sv-graphql-client` `GraphServer` to use as a client library for accessing `booking` in GraphQL.

JavaScript:
```js
const { BookingPrefix } = require("@simpleview/sv-booking-client");
const { GraphServer } = require("@simpleview/sv-graphql-client");

module.exports = new GraphServer({ graphUrl: GRAPHQL_URL, prefixes: [BookingPrefix] });
```

TypeScript:
```ts
import { BookingPrefix } from "@simpleview/sv-orion-client";
import { GraphServer } from "@simpleview/sv-graphql-client";

export default new GraphServer({ graphUrl: GRAPHQL_URL, prefixes: [BookingPrefix] });
```

Where you are making server requests:

JavaScript:
```js
const { booking } = require("./bookingGraphServer");
```

TypeScript:
```ts
import { booking } from "./bookingGraphServer";
```

### BookingPrefix.bd_calendar

This method wraps the `booking.bd_calendar` GraphQL query.

```js
const result = await booking.bd_calendar({
	fields: `
		redirect_url
		docs {
			date
			los
			rate
		}
	`,
	filter: {
		booking_name: "test.bookdirect.net",
		property_id: "1",
		start_date: "3000-01-01",
		end_date: "3000-01-02",
		currency: "USD"
	}
});
```

### BookingPrefix.bd_liverates

This method wraps the `booking.bd_liverates` GraphQL query.

```js
const result = await booking.bd_liverates({
	fields: `
		docs {
			property_id
			suppliers {
				redirect_url
				date_options {
					occupancies {
						options {
							rate {
								total
								average
							}
						}
					}
				}
			}
		}
	`,
	filter: {
		booking_name: "test.bookdirect.net",
		start_date: "3000-01-01",
		end_date: "3000-01-20",
		property_ids: [
			"1",
			"2",
			"3"
		],
		currency: "USD"
	}
});
```

### BookingPrefix.pe_liverates

This method wraps the `booking.pe_liverates` GraphQL query.

```js
const result = await booking.pe_liverates({
	fields: `
		docs {
			property_id
			suppliers {
				supplier_id
				supplier_logo
				redirect_url
				date_options {
					start_date
					end_date
					redirect_url_postfix
					occupancies {
						occupancy {
							adults
							children
						}
						options {
							name
							redirect_url_postfix
							rate {
								total
								average
							}
						}
					}
				}
			}
		}
	`,
	filter: {
		booking_name: "TestClient",
		start_date: "3000-01-01",
		end_date: "3000-01-02",
		fuzzy: 1,
		property_ids: [
			"1",
			"2",
			"3"
		],
		occupancies: [
			{ adults: 2, children: 0 },
			{ adults: 2, children: 1, ages: [4] }
		],
		currency: "GBP"
	}
});
```

### BookingPrefix.events

This method wraps the `booking.events` GraphQL query.

```js
const result = await booking.events({
	fields: `
		count
		docs {
			service_name
			event_id
			canonical_id
			venue_id
			name
			url
			image_url
			start_date
			end_date
			data
		}
	`,
	filter: {
		service_name: "ticketmaster",
		event_ids: ["1", "2", "3"]
	},
	options: {
		limit: 10,
		skip: 0,
		sort: {
			field: "start_date",
			dir: "asc"
		}
	}
});
```

### BookingPrefix.events_update

This method wraps the `booking.events_update` GraphQL mutation.

```js
const result = await booking.events_update({
	fields: `
		success
		message
		docs {
			service_name
			event_id
			canonical_id
			venue_id
			name
			url
			image_url
			start_date
			end_date
			data
		}
	`,
	input: {
		service_name: "ticketmaster",
		venue_id: "1"
	},
	context: {
		acct_id: "sv-all",
		token // from serviceAccountToken call
	}
});
```

### BookingPrefix.event_venues

This method wraps the `booking.event_venues` GraphQL query.

```js
const result = await booking.event_venues({
	fields: `
		count
		docs {
			service_name
			venue_id
			name
			city
			state
			zip_code
			country_code
			data
		}
	`,
	filter: {
		service_name: "ticketmaster",
		zip_codes: ["12345"]
	}
});
```

### BookingPrefix.ticketed_events

This method wraps the `booking.ticketed_events` GraphQL query.

```js
const result = await booking.ticketed_events({
	fields: `
		count
		docs {
			supplier_id
			service_name
			product_id
			canonical_id
			name
			supplier_name
			price_from
			currency
			description
			url
			images {
				url
				caption
			}
			rating
		}
	`,
	filter: {
		service_name: "fareharbor",
		product_ids: ["1", "2", "3"]
	},
	options: {
		limit: 10,
		skip: 0,
		sort: {
			field: "name",
			dir: "asc"
		}
	}
});
```

### BookingPrefix.ticketed_events_destinations

This method wraps the `booking.ticketed_events_destinations` GraphQL query.

```js
const result = await booking.ticketed_events_destinations({
	fields: `
		count
		docs {
			service_name
			destination_id
			name
			currency
		}
	`,
	filter: {
		service_name: "viator"
	},
	options: {
		limit: 10,
		skip: 0,
		sort: {
			field: "name",
			dir: "asc"
		}
	}
});
```

### BookingPrefix.ticketed_events_destinations_upsert

This method wraps the `booking.ticketed_events_destinations_upsert` GraphQL mutation.

```js
const result = await booking.ticketed_events_destinations_upsert({
	fields: `
		success
		message
		results {
			success
			message
			doc {
				service_name
				destination_id
				name
				currency
			}
		}
		errors {
			success
			message
			doc {
				service_name
				destination_id
				name
				currency
			}
		}
	`,
	input: {
		service_name: "viator",
		destination_id: "test.id",
		name: "Test Name",
		currency: "USD"
	},
	context: {
		acct_id: "sv-all",
		token // from serviceAccountToken call
	}
});
```

### BookingPrefix.ticketed_events_destinations_remove

This method wraps the `booking.ticketed_events_destinations_remove` GraphQL mutation.

```js
const result = await booking.ticketed_events_destinations_remove({
	fields: `
		success
		message
	`,
	input: {
		service_name: "viator",
		destination_id: "test.id"
	},
	context: {
		acct_id: "sv-all",
		token // from serviceAccountToken call
	}
});
```

### BookingPrefix.ticketed_events_destinations_fetch_viator

This method wraps the `booking.ticketed_events_destinations_fetch_viator` GraphQL query.

```js
const result = await booking.ticketed_events_destinations_fetch_viator({
	fields: `
		count
		docs {
			destination_id
			name
			currency
			type
			parent_id
		}
	`
});
```

### BookingPrefix.ticketed_events_suppliers_fetch_viator

This method wraps the `booking.ticketed_events_suppliers_fetch_viator` GraphQL query.

```js
const result = await booking.ticketed_events_suppliers_fetch_viator({
	fields: `
		count
		docs {
			supplier_id
			supplier_name
		}
	`,
	input: {
		destination_id: "123"
	}
});
```

## Related Documentation

* [sv-graphql-client](https://github.com/simpleviewinc/sv-graphql-client/)
* [sv-booking](https://github.com/simpleviewinc/sv-booking/)

## Troubleshooting

For any assistance please reach out on the [sv-booking](https://simpleview-workspace.slack.com/archives/C01CJ4XKWP7) Slack channel.