tipi-cloudbeds
Version:
Node.js library to connect to cloudbeds REST API
257 lines (231 loc) • 7.79 kB
JavaScript
const Joi = require('joi')
const GrantType = require('./enums/GrantType')
const WebHookEventAction = require('./enums/WebHookEventAction')
const WebHookEventObject = require('./enums/WebHookEventObject')
const AppState = require('./enums/AppState')
const Gender = require('./enums/Gender')
const IdType = require('./enums/IdType')
const GuestStatus = require('./enums/GuestStatus')
const dateRegex = /^([12]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01]))$/
const tokensSchema = Joi.object().unknown().keys({
accessToken: Joi.string().required(),
tokenType: Joi.string().required()
})
exports.generateToken = Joi.object().keys({
grantType: Joi.string().valid(Object.values(GrantType)).required(),
redirectUri: Joi.string().uri().when('grantType', {
is: `${GrantType.authorizationCode}`,
then: Joi.required()
}),
code: Joi.string().when('grantType', {
is: `${GrantType.authorizationCode}`,
then: Joi.required()
}),
refreshToken: Joi.string().when('grantType', {
is: `${GrantType.refreshToken}`,
then: Joi.required()
}),
})
exports.generateTokenByCode = Joi.object().keys({
redirectUri: Joi.string().uri().required(),
code: Joi.string().required()
})
exports.generateTokenByRefreshToken = Joi.object().keys({
refreshToken: Joi.string().required()
})
exports.checkAccessToken = tokensSchema
exports.refreshAccessToken = Joi.object().keys({
accessToken: Joi.string().required(),
refreshToken: Joi.string().required(),
tokenType: Joi.string().required()
})
exports.subscribeToEvent = Joi.object().keys({
tokens: tokensSchema,
data: Joi.object().keys({
object: Joi.string().valid(Object.values(WebHookEventObject)).required(),
action: Joi.string().valid(Object.values(WebHookEventAction)).required(),
endpointUrl: Joi.string().uri().required()
})
})
exports.unSubscribeFromEvent = Joi.object().keys({
tokens: tokensSchema,
data: Joi.object().keys({
subscriptionId: Joi.string().required()
})
})
exports.getReservationById = Joi.object().keys({
tokens: tokensSchema,
data: Joi.object().keys({
reservationId: Joi.string().required()
})
})
exports.getReservations = Joi.object().keys({
tokens: tokensSchema,
data: Joi.object().keys({
propertyId: Joi.string(),
modifiedFrom: Joi.date(),
modifiedTo: Joi.date(),
checkOutFrom: Joi.date(),
checkOutTo: Joi.date(),
resultsFrom: Joi.date(),
resultsTo: Joi.date(),
status: Joi.string(),
pageNumber: Joi.number().integer().min(1),
pageSize: Joi.number().integer().min(1).max(100),
sortByRecent: Joi.boolean(),
includeGuestsDetails: Joi.boolean(),
})
})
exports.postAppState = Joi.object().keys({
tokens: tokensSchema,
data: Joi.object().keys({
propertyId: Joi.string().required(),
appState: Joi.string().valid(Object.values(AppState)).required()
})
})
exports.getHotels = tokensSchema
exports.getRooms = Joi.object().keys({
tokens: tokensSchema,
data: Joi.object().keys({
page: Joi.number().default(1),
size: Joi.number().default(10000)
})
})
exports.getReservationsWithRateDetails = Joi.object().keys({
tokens: tokensSchema,
data: Joi.object().keys({
reservationId: Joi.string().required()
})
})
exports.postRoomCheckIn = Joi.object().keys({
tokens: tokensSchema,
data: Joi.object().unknown().keys({
reservationId: Joi.string().required(),
subReservationId: Joi.string(),
roomId: Joi.string()
})
})
exports.getHousekeepingStatus = Joi.object().keys({
tokens: tokensSchema,
data: Joi.object().keys({
roomTypeIds: Joi.string(),
housekeeperIds: Joi.string(),
roomCondition: Joi.string(),
roomOccupied: Joi.boolean(),
pageNumber: Joi.number(),
pageSize: Joi.number()
})
})
exports.postReservationNote = Joi.object().keys({
tokens: tokensSchema,
data: Joi.object().unknown().keys({
reservationId: Joi.string().required(),
reservationNote: Joi.string().required()
})
})
exports.getWebhooks = Joi.object().keys({
tokens: tokensSchema
})
exports.getGuestsByFilter = Joi.object().keys({
tokens: tokensSchema,
data: Joi.object().unknown().keys({
propertyIds: Joi.string(),
reservationId: Joi.string(),
roomId: Joi.string(),
status: Joi.string().valid(Object.values(GuestStatus)),
guestName: Joi.string(),
checkInFrom: Joi.string().regex(dateRegex),
checkInTo: Joi.string().regex(dateRegex),
checkOutFrom: Joi.string().regex(dateRegex),
checkOutTo: Joi.string().regex(dateRegex),
})
})
exports.getGuest = Joi.object().keys({
tokens: tokensSchema,
data: Joi.object().unknown().keys({
propertyId: Joi.string(),
reservationId: Joi.string(),
guestId: Joi.string()
}).or('reservationId', 'guestId')
})
exports.putGuest = Joi.object().keys({
tokens: tokensSchema,
data: Joi.object().unknown().keys({
guestId: Joi.string().required(),
propertyId: Joi.string(),
guestFirstName: Joi.string(),
guestLastName: Joi.string(),
guestGender: Joi.string().valid(Object.values(Gender)),
guestEmail: Joi.string(),
guestPhone: Joi.string(),
guestCellPhone: Joi.string(),
guestAddress1: Joi.string(),
guestAddress2: Joi.string(),
guestCity: Joi.string(),
guestCountry: Joi.string(),
guestState: Joi.string(),
guestZip: Joi.string(),
guestBirthDate: Joi.string().regex(dateRegex),
guestDocumentType: Joi.string().valid(Object.values(IdType)),
guestDocumentNumber: Joi.string(),
guestDocumentIssueDate: Joi.string().regex(dateRegex),
guestDocumentIssuingCountry: Joi.string(),
guestDocumentExpirationDate: Joi.string().regex(dateRegex),
guestCompanyName: Joi.string(),
guestCompanyTaxId: Joi.string(),
guestTaxId: Joi.string()
}).and(
'guestDocumentType',
'guestDocumentNumber',
'guestDocumentIssueDate',
'guestDocumentIssuingCountry',
'guestDocumentExpirationDate'
)
})
exports.postGuest = Joi.object().keys({
tokens: tokensSchema,
data: Joi.object().unknown().keys({
reservationId: Joi.string().required(),
guestFirstName: Joi.string().required(),
guestLastName: Joi.string().required(),
guestEmail: Joi.string().required(),
guestCountry: Joi.string().required(),
propertyId: Joi.string(),
guestGender: Joi.string().valid(Object.values(Gender)),
guestPhone: Joi.string(),
guestCellPhone: Joi.string(),
guestAddress1: Joi.string(),
guestAddress2: Joi.string(),
guestCity: Joi.string(),
guestState: Joi.string(),
guestZip: Joi.string(),
guestBirthDate: Joi.string().regex(dateRegex),
guestDocumentType: Joi.string().valid(Object.values(IdType)),
guestDocumentNumber: Joi.string(),
guestDocumentIssueDate: Joi.string().regex(dateRegex),
guestDocumentIssuingCountry: Joi.string(),
guestDocumentExpirationDate: Joi.string().regex(dateRegex),
guestNote: Joi.string(),
reservationNote: Joi.string(),
guestCompanyName: Joi.string(),
guestCompanyTaxId: Joi.string(),
guestTaxId: Joi.string()
}).and(
'guestDocumentType',
'guestDocumentNumber',
'guestDocumentIssueDate',
'guestDocumentIssuingCountry',
'guestDocumentExpirationDate'
)
})
exports.postGuestsToRoom = Joi.object().keys({
tokens: tokensSchema,
data: Joi.object().unknown().keys({
reservationId: Joi.string().required(),
roomId: Joi.string().required(),
guestIds: Joi.string().required(),
propertyId: Joi.string(),
removeGuestIds: Joi.string(),
removeAll: Joi.boolean()
})
})