@gomeddo/sdk
Advanced tools
Comparing version 0.0.6 to 0.0.7
import { Environment } from '../index'; | ||
import { SFResource } from '../s-objects/resource'; | ||
import { APIConditionElement } from './request-bodies/api-condition'; | ||
@@ -12,2 +11,5 @@ import AvailabilityTimeSlotResponse from './availability-reponse'; | ||
import ReservationCollection from './request-bodies/reservation-collection'; | ||
import FindAvailableIdsRequest from '../find-available-ids-request'; | ||
import { CustomSFSObject } from '../s-objects/s-object'; | ||
import { SFResource } from '../s-objects/resource'; | ||
export default class GoMeddoAPI { | ||
@@ -18,2 +20,3 @@ private readonly baseUrl; | ||
searchResources(parentIds: string[], parentNames: string[], apiCondition: APIConditionElement | undefined, fields: Set<string>): Promise<SFResource[]>; | ||
searchDimensionRecords(parentIds: string[], parentNames: string[], apiCondition: APIConditionElement | undefined, fields: Set<string>, dimension: string): Promise<CustomSFSObject[]>; | ||
searchReservations(reservationIds: Set<string>, rangeStart: Date | null, rangeEnd: Date | null, apiCondition: APIConditionElement | undefined, fields: Set<string>): Promise<SFReservation[]>; | ||
@@ -26,2 +29,3 @@ saveReservation(saveRequest: ReservationSaveRequest): Promise<object>; | ||
getServiceAvailability(requestBody: ServiceTimeSlotRequest): Promise<ServiceTimeSlotResponse[]>; | ||
findAvailableDimensionIds(requestBody: FindAvailableIdsRequest): Promise<string[]>; | ||
private getHeaders; | ||
@@ -28,0 +32,0 @@ private addFieldsToUrl; |
@@ -37,5 +37,10 @@ "use strict"; | ||
return __awaiter(this, void 0, void 0, function* () { | ||
return yield this.searchDimensionRecords(parentIds, parentNames, apiCondition, fields, 'B25__Resource__c'); | ||
}); | ||
} | ||
searchDimensionRecords(parentIds, parentNames, apiCondition, fields, dimension) { | ||
return __awaiter(this, void 0, void 0, function* () { | ||
const url = new URL('B25/v1/dimensionRecords/search', this.baseUrl); | ||
this.addFieldsToUrl(url, fields); | ||
const dimensionSearchBody = new dimension_search_body_1.default('B25__Resource__c', parentIds, parentNames, apiCondition, true); | ||
const dimensionSearchBody = new dimension_search_body_1.default(dimension, parentIds, parentNames, apiCondition, true); | ||
const response = yield fetch(url.href, { | ||
@@ -135,2 +140,15 @@ method: 'POST', | ||
} | ||
findAvailableDimensionIds(requestBody) { | ||
return __awaiter(this, void 0, void 0, function* () { | ||
const url = new URL('B25/v1/findAvailableDimensionIds', this.baseUrl); | ||
const response = yield fetch(url.href, { | ||
method: 'POST', | ||
body: JSON.stringify(requestBody), | ||
headers: this.getHeaders() | ||
}); | ||
yield this.checkResponse(response); | ||
const data = yield response.json(); | ||
return data; | ||
}); | ||
} | ||
getHeaders() { | ||
@@ -137,0 +155,0 @@ return { |
@@ -16,2 +16,4 @@ import ResourceRequest from './resource-request'; | ||
import { Condition, AndCondition, OrCondition, Operator } from './filters/conditions'; | ||
import DimensionRecordRequest from './dimension-record-request'; | ||
import TimeSlotConfiguration from './utils/time-slot-configuration'; | ||
declare enum Environment { | ||
@@ -42,2 +44,8 @@ DEVELOP = 0, | ||
/** | ||
* Creates a new request for resources. The request can then be specified using methods on the resource request. | ||
* | ||
* @returns new resource request using the authentication from this GoMeddo instance | ||
*/ | ||
buildDimensionRecordRequest(dimensionName: string): DimensionRecordRequest; | ||
/** | ||
* Creates a new request for reservations. The request can then be specified using methods on the reservation request. | ||
@@ -91,3 +99,3 @@ * | ||
} | ||
export { Environment, ResourceRequest, ReservationRequest, ResourceResult, ReservationResult, SObject, Reservation, Resource, Contact, Lead, Service, ServiceReservation, TimeSlot, AvailabilitySlotType, AvailabilityTimeSlot, ServiceTimeSlot, Condition, AndCondition, OrCondition, Operator }; | ||
export { Environment, ResourceRequest, DimensionRecordRequest, ReservationRequest, ResourceResult, ReservationResult, SObject, Reservation, Resource, Contact, Lead, Service, ServiceReservation, TimeSlot, AvailabilitySlotType, AvailabilityTimeSlot, ServiceTimeSlot, Condition, AndCondition, OrCondition, Operator, TimeSlotConfiguration }; | ||
export default GoMeddo; |
@@ -12,3 +12,3 @@ "use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.Operator = exports.OrCondition = exports.AndCondition = exports.Condition = exports.ServiceTimeSlot = exports.AvailabilityTimeSlot = exports.AvailabilitySlotType = exports.TimeSlot = exports.ServiceReservation = exports.Service = exports.Lead = exports.Contact = exports.Resource = exports.Reservation = exports.SObject = exports.ReservationResult = exports.ResourceResult = exports.ReservationRequest = exports.ResourceRequest = exports.Environment = void 0; | ||
exports.TimeSlotConfiguration = exports.Operator = exports.OrCondition = exports.AndCondition = exports.Condition = exports.ServiceTimeSlot = exports.AvailabilityTimeSlot = exports.AvailabilitySlotType = exports.TimeSlot = exports.ServiceReservation = exports.Service = exports.Lead = exports.Contact = exports.Resource = exports.Reservation = exports.SObject = exports.ReservationResult = exports.ResourceResult = exports.ReservationRequest = exports.DimensionRecordRequest = exports.ResourceRequest = exports.Environment = void 0; | ||
const gomeddo_api_requests_1 = require("./api/gomeddo-api-requests"); | ||
@@ -49,2 +49,6 @@ const resource_request_1 = require("./resource-request"); | ||
Object.defineProperty(exports, "Operator", { enumerable: true, get: function () { return conditions_1.Operator; } }); | ||
const dimension_record_request_1 = require("./dimension-record-request"); | ||
exports.DimensionRecordRequest = dimension_record_request_1.default; | ||
const time_slot_configuration_1 = require("./utils/time-slot-configuration"); | ||
exports.TimeSlotConfiguration = time_slot_configuration_1.default; | ||
var Environment; | ||
@@ -79,2 +83,10 @@ (function (Environment) { | ||
/** | ||
* Creates a new request for resources. The request can then be specified using methods on the resource request. | ||
* | ||
* @returns new resource request using the authentication from this GoMeddo instance | ||
*/ | ||
buildDimensionRecordRequest(dimensionName) { | ||
return new dimension_record_request_1.default(this.api, dimensionName); | ||
} | ||
/** | ||
* Creates a new request for reservations. The request can then be specified using methods on the reservation request. | ||
@@ -81,0 +93,0 @@ * |
@@ -0,4 +1,4 @@ | ||
import ResourceResult from './resource-result'; | ||
import DimensionRecordRequest from './dimension-record-request'; | ||
import GoMeddoAPI from './api/gomeddo-api-requests'; | ||
import ResourceResult from './resource-result'; | ||
import { ConditionElement } from './filters/conditions'; | ||
/** | ||
@@ -8,11 +8,5 @@ * Resource request by default will request all resources in an org. | ||
*/ | ||
export default class ResourceRequest { | ||
private readonly api; | ||
private readonly standardFields; | ||
private readonly additionalFields; | ||
export default class ResourceRequest extends DimensionRecordRequest { | ||
private readonly parents; | ||
private readonly types; | ||
private condition; | ||
private startOfRange; | ||
private endOfRange; | ||
private fetchServices; | ||
@@ -36,33 +30,2 @@ constructor(api: GoMeddoAPI); | ||
/** | ||
* Filter the resources on field values using conditions. | ||
* | ||
* @param conditions The conditions to filter on. Multiple conditions wil be combined using AND. | ||
* @returns The updated resource request. | ||
*/ | ||
withCondition(...conditions: ConditionElement[]): ResourceRequest; | ||
/** | ||
* Request an additional field to be returned for the resources | ||
* | ||
* @param fieldName The api name of the field to request | ||
* @returns The updated resource request. | ||
*/ | ||
includeAdditionalField(fieldName: string): ResourceRequest; | ||
/** | ||
* Request additional fields to be returned for the resources | ||
* | ||
* @param fieldName The api names of the fields to request | ||
* @returns The updated resource request. | ||
*/ | ||
includeAdditionalFields(fieldNames: Set<string> | string[]): ResourceRequest; | ||
/** | ||
* Request on resources that are not fully booked between the two datetime. | ||
* The input datetimes are interpeted in GMT | ||
* When this is requested timeslots for the requested range are provided for each resource. | ||
* | ||
* @param startOfRange The start of the timeslot range | ||
* @param endOfRange The end of the timeslot range | ||
* @returns The updated resource request. | ||
*/ | ||
withAvailableSlotsBetween(startOfRange: Date, endOfRange: Date): ResourceRequest; | ||
/** | ||
* Also fetch the services including slot for when the services are available | ||
@@ -82,3 +45,2 @@ * Only valid if withAvailableSlotsBetween has also been called. | ||
private getStartingResourceScope; | ||
private getRequestedFields; | ||
} |
@@ -17,2 +17,4 @@ "use strict"; | ||
const salesforce_utils_1 = require("./utils/salesforce-utils"); | ||
const find_available_ids_request_1 = require("./find-available-ids-request"); | ||
const dimension_record_request_1 = require("./dimension-record-request"); | ||
/** | ||
@@ -22,14 +24,11 @@ * Resource request by default will request all resources in an org. | ||
*/ | ||
class ResourceRequest { | ||
class ResourceRequest extends dimension_record_request_1.default { | ||
constructor(api) { | ||
super(api, 'B25__Resource__c'); | ||
this.parents = new Set(); | ||
this.types = new Set(); | ||
this.fetchServices = false; | ||
this.standardFields = new Set([ | ||
'Id', 'Name', 'B25__Resource_Type__c', 'B25__Parent__c' | ||
]); | ||
this.additionalFields = new Set(); | ||
this.parents = new Set(); | ||
this.types = new Set(); | ||
this.startOfRange = null; | ||
this.endOfRange = null; | ||
this.fetchServices = false; | ||
this.api = api; | ||
} | ||
@@ -58,54 +57,2 @@ /** | ||
/** | ||
* Filter the resources on field values using conditions. | ||
* | ||
* @param conditions The conditions to filter on. Multiple conditions wil be combined using AND. | ||
* @returns The updated resource request. | ||
*/ | ||
withCondition(...conditions) { | ||
if (this.condition === undefined) { | ||
this.condition = new conditions_1.OrCondition([]); | ||
} | ||
if (conditions.length === 1) { | ||
this.condition.conditions.push(conditions[0]); | ||
} | ||
else { | ||
this.condition.conditions.push(new conditions_1.AndCondition(conditions)); | ||
} | ||
return this; | ||
} | ||
/** | ||
* Request an additional field to be returned for the resources | ||
* | ||
* @param fieldName The api name of the field to request | ||
* @returns The updated resource request. | ||
*/ | ||
includeAdditionalField(fieldName) { | ||
this.additionalFields.add(fieldName); | ||
return this; | ||
} | ||
/** | ||
* Request additional fields to be returned for the resources | ||
* | ||
* @param fieldName The api names of the fields to request | ||
* @returns The updated resource request. | ||
*/ | ||
includeAdditionalFields(fieldNames) { | ||
fieldNames.forEach(fieldName => this.includeAdditionalField(fieldName)); | ||
return this; | ||
} | ||
/** | ||
* Request on resources that are not fully booked between the two datetime. | ||
* The input datetimes are interpeted in GMT | ||
* When this is requested timeslots for the requested range are provided for each resource. | ||
* | ||
* @param startOfRange The start of the timeslot range | ||
* @param endOfRange The end of the timeslot range | ||
* @returns The updated resource request. | ||
*/ | ||
withAvailableSlotsBetween(startOfRange, endOfRange) { | ||
this.startOfRange = startOfRange; | ||
this.endOfRange = endOfRange; | ||
return this; | ||
} | ||
/** | ||
* Also fetch the services including slot for when the services are available | ||
@@ -130,2 +77,8 @@ * Only valid if withAvailableSlotsBetween has also been called. | ||
const resourceResult = new resource_result_1.default(resources); | ||
if (this.reservation !== null) { | ||
const resourceIds = resourceResult.getResourceIds(); | ||
const dimension = new find_available_ids_request_1.default('B25__Resource__c', resourceIds, null, this.reservation.getSFSObject()); | ||
const availableDimensionIds = yield this.api.findAvailableDimensionIds(dimension); | ||
resourceResult.filterResourcesById(availableDimensionIds); | ||
} | ||
if (this.startOfRange !== null && this.endOfRange !== null) { | ||
@@ -149,16 +102,16 @@ const availabilityData = yield this.api.getAvailability(new availability_request_1.default(this.startOfRange, this.endOfRange, resourceResult.getResourceIds())); | ||
} | ||
let condition = this.condition; | ||
let condition = new conditions_1.AndCondition([]); | ||
if (this.types.size !== 0) { | ||
condition = new conditions_1.AndCondition([...this.types].map(type => new conditions_1.Condition('B25__Resource_Type__r.Name', conditions_1.Operator.EQUAL, type))); | ||
if (this.condition !== undefined) { | ||
condition.conditions.push(this.condition); | ||
} | ||
condition.conditions.push(new conditions_1.OrCondition([...this.types].map(type => new conditions_1.Condition('B25__Resource_Type__r.Name', conditions_1.Operator.EQUAL, type)))); | ||
} | ||
return yield this.api.searchResources(parentIds, parentNames, condition === null || condition === void 0 ? void 0 : condition.getAPICondition(), this.getRequestedFields()); | ||
if (this.condition !== undefined) { | ||
condition.conditions.push(this.condition); | ||
} | ||
if (condition.conditions.length === 0) { | ||
condition = undefined; | ||
} | ||
return (yield this.api.searchDimensionRecords(parentIds, parentNames, condition === null || condition === void 0 ? void 0 : condition.getAPICondition(), this.getRequestedFields(), 'B25__Resource__c')); | ||
}); | ||
} | ||
getRequestedFields() { | ||
return new Set([...this.standardFields, ...this.additionalFields]); | ||
} | ||
} | ||
exports.default = ResourceRequest; |
import AvailabilityTimeSlotResponse from './api/availability-reponse'; | ||
import ServiceTimeSlotResponse from './api/service-availability-response'; | ||
import DimensionRecordResult from './dimension-record-result'; | ||
import Resource, { SFResource } from './s-objects/resource'; | ||
@@ -7,7 +8,7 @@ /** | ||
*/ | ||
export default class ResourceResult { | ||
export default class ResourceResult extends DimensionRecordResult { | ||
private readonly resourcesById; | ||
constructor(sfResourceData: SFResource[]); | ||
computeTreeStructure(): ResourceResult; | ||
addAvailabilitySlotData(dimensionsSlotData: AvailabilityTimeSlotResponse[]): void; | ||
addAvailabilitySlotData(resourceSlotData: AvailabilityTimeSlotResponse[]): void; | ||
addServiceSlotData(dimensionsServiceSlotData: ServiceTimeSlotResponse[]): void; | ||
@@ -27,2 +28,9 @@ /** | ||
getResource(idOrName: string): Resource | undefined; | ||
/** | ||
* Filters the resources in the `resourcesById` map based on the allowed ids. | ||
* @internal | ||
* @param resourceIds The ids of the resources that are allowed to remain in the map. | ||
* @returns void | ||
*/ | ||
filterResourcesById(resourceIds: string[]): void; | ||
} |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
const dimension_record_result_1 = require("./dimension-record-result"); | ||
const resource_1 = require("./s-objects/resource"); | ||
@@ -8,4 +9,5 @@ const salesforce_utils_1 = require("./utils/salesforce-utils"); | ||
*/ | ||
class ResourceResult { | ||
class ResourceResult extends dimension_record_result_1.default { | ||
constructor(sfResourceData) { | ||
super(sfResourceData); | ||
// Map all resources to their ids | ||
@@ -33,4 +35,4 @@ this.resourcesById = sfResourceData.reduce((map, sfResourceData) => { | ||
} | ||
addAvailabilitySlotData(dimensionsSlotData) { | ||
dimensionsSlotData.forEach((slotData) => { | ||
addAvailabilitySlotData(resourceSlotData) { | ||
resourceSlotData.forEach((slotData) => { | ||
const matchingResource = this.resourcesById.get(slotData.dimensionId); | ||
@@ -77,3 +79,16 @@ if (matchingResource === undefined) { | ||
} | ||
/** | ||
* Filters the resources in the `resourcesById` map based on the allowed ids. | ||
* @internal | ||
* @param resourceIds The ids of the resources that are allowed to remain in the map. | ||
* @returns void | ||
*/ | ||
filterResourcesById(resourceIds) { | ||
this.resourcesById.forEach((resource, id) => { | ||
if (!resourceIds.includes(id)) { | ||
this.resourcesById.delete(id); | ||
} | ||
}); | ||
} | ||
} | ||
exports.default = ResourceResult; |
@@ -1,11 +0,9 @@ | ||
import AvailabilityTimeSlotResponse from '../api/availability-reponse'; | ||
import SObject, { CustomSFSObject } from './s-object'; | ||
import { AvailabilityTimeSlot } from '../time-slots/availability-time-slot'; | ||
import { CustomSFSObject } from './s-object'; | ||
import Service from './service'; | ||
import ServiceTimeSlotResponse from '../api/service-availability-response'; | ||
import DimensionRecord from '../dimension-record'; | ||
/** | ||
* A Resource | ||
*/ | ||
export default class Resource extends SObject { | ||
name: string; | ||
export default class Resource extends DimensionRecord { | ||
parentId: string | null; | ||
@@ -15,11 +13,5 @@ parent: Resource | null; | ||
services: Map<string, Service>; | ||
private timeSlots; | ||
constructor(parsedResource: SFResource); | ||
/** | ||
* @internal | ||
* Adds availability slot data for this resource to the resource. | ||
*/ | ||
addAvailabilitySlotData(slotData: AvailabilityTimeSlotResponse): void; | ||
/** | ||
* @internal | ||
* Adds service availability slot data for this resource to the resource. | ||
@@ -34,7 +26,2 @@ */ | ||
/** | ||
* Gets the timeslots for this resource. Only available if withAvailableSlotsBetween was called. | ||
* @return The timeslots for this resource. | ||
*/ | ||
getTimeSlots(): AvailabilityTimeSlot[]; | ||
/** | ||
* Gets the available service for this resource. Only available if withAvailableSlotsBetween, and includeServices were called. | ||
@@ -41,0 +28,0 @@ * @return The available services for this resource. |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
const s_object_1 = require("./s-object"); | ||
const availability_time_slot_1 = require("../time-slots/availability-time-slot"); | ||
const salesforce_utils_1 = require("../utils/salesforce-utils"); | ||
const dimension_record_1 = require("../dimension-record"); | ||
/** | ||
* A Resource | ||
*/ | ||
class Resource extends s_object_1.default { | ||
class Resource extends dimension_record_1.default { | ||
constructor(parsedResource) { | ||
@@ -16,3 +16,2 @@ var _a; | ||
this.services = new Map(); | ||
this.timeSlots = []; | ||
this.name = parsedResource.Name; | ||
@@ -23,9 +22,2 @@ this.parentId = (_a = parsedResource.B25__Parent__c) !== null && _a !== void 0 ? _a : null; | ||
* @internal | ||
* Adds availability slot data for this resource to the resource. | ||
*/ | ||
addAvailabilitySlotData(slotData) { | ||
this.timeSlots = slotData.timeSlots; | ||
} | ||
/** | ||
* @internal | ||
* Adds service availability slot data for this resource to the resource. | ||
@@ -44,9 +36,2 @@ */ | ||
/** | ||
* Gets the timeslots for this resource. Only available if withAvailableSlotsBetween was called. | ||
* @return The timeslots for this resource. | ||
*/ | ||
getTimeSlots() { | ||
return this.timeSlots; | ||
} | ||
/** | ||
* Gets the available service for this resource. Only available if withAvailableSlotsBetween, and includeServices were called. | ||
@@ -53,0 +38,0 @@ * @return The available services for this resource. |
import { Environment } from '../index'; | ||
import { SFResource } from '../s-objects/resource'; | ||
import { APIConditionElement } from './request-bodies/api-condition'; | ||
@@ -12,2 +11,5 @@ import AvailabilityTimeSlotResponse from './availability-reponse'; | ||
import ReservationCollection from './request-bodies/reservation-collection'; | ||
import FindAvailableIdsRequest from '../find-available-ids-request'; | ||
import { CustomSFSObject } from '../s-objects/s-object'; | ||
import { SFResource } from '../s-objects/resource'; | ||
export default class GoMeddoAPI { | ||
@@ -18,2 +20,3 @@ private readonly baseUrl; | ||
searchResources(parentIds: string[], parentNames: string[], apiCondition: APIConditionElement | undefined, fields: Set<string>): Promise<SFResource[]>; | ||
searchDimensionRecords(parentIds: string[], parentNames: string[], apiCondition: APIConditionElement | undefined, fields: Set<string>, dimension: string): Promise<CustomSFSObject[]>; | ||
searchReservations(reservationIds: Set<string>, rangeStart: Date | null, rangeEnd: Date | null, apiCondition: APIConditionElement | undefined, fields: Set<string>): Promise<SFReservation[]>; | ||
@@ -26,2 +29,3 @@ saveReservation(saveRequest: ReservationSaveRequest): Promise<object>; | ||
getServiceAvailability(requestBody: ServiceTimeSlotRequest): Promise<ServiceTimeSlotResponse[]>; | ||
findAvailableDimensionIds(requestBody: FindAvailableIdsRequest): Promise<string[]>; | ||
private getHeaders; | ||
@@ -28,0 +32,0 @@ private addFieldsToUrl; |
@@ -25,5 +25,8 @@ import { Environment } from '../index'; | ||
async searchResources(parentIds, parentNames, apiCondition, fields) { | ||
return await this.searchDimensionRecords(parentIds, parentNames, apiCondition, fields, 'B25__Resource__c'); | ||
} | ||
async searchDimensionRecords(parentIds, parentNames, apiCondition, fields, dimension) { | ||
const url = new URL('B25/v1/dimensionRecords/search', this.baseUrl); | ||
this.addFieldsToUrl(url, fields); | ||
const dimensionSearchBody = new DimensionSearchBody('B25__Resource__c', parentIds, parentNames, apiCondition, true); | ||
const dimensionSearchBody = new DimensionSearchBody(dimension, parentIds, parentNames, apiCondition, true); | ||
const response = await fetch(url.href, { | ||
@@ -108,2 +111,13 @@ method: 'POST', | ||
} | ||
async findAvailableDimensionIds(requestBody) { | ||
const url = new URL('B25/v1/findAvailableDimensionIds', this.baseUrl); | ||
const response = await fetch(url.href, { | ||
method: 'POST', | ||
body: JSON.stringify(requestBody), | ||
headers: this.getHeaders() | ||
}); | ||
await this.checkResponse(response); | ||
const data = await response.json(); | ||
return data; | ||
} | ||
getHeaders() { | ||
@@ -110,0 +124,0 @@ return { |
@@ -16,2 +16,4 @@ import ResourceRequest from './resource-request'; | ||
import { Condition, AndCondition, OrCondition, Operator } from './filters/conditions'; | ||
import DimensionRecordRequest from './dimension-record-request'; | ||
import TimeSlotConfiguration from './utils/time-slot-configuration'; | ||
declare enum Environment { | ||
@@ -42,2 +44,8 @@ DEVELOP = 0, | ||
/** | ||
* Creates a new request for resources. The request can then be specified using methods on the resource request. | ||
* | ||
* @returns new resource request using the authentication from this GoMeddo instance | ||
*/ | ||
buildDimensionRecordRequest(dimensionName: string): DimensionRecordRequest; | ||
/** | ||
* Creates a new request for reservations. The request can then be specified using methods on the reservation request. | ||
@@ -91,3 +99,3 @@ * | ||
} | ||
export { Environment, ResourceRequest, ReservationRequest, ResourceResult, ReservationResult, SObject, Reservation, Resource, Contact, Lead, Service, ServiceReservation, TimeSlot, AvailabilitySlotType, AvailabilityTimeSlot, ServiceTimeSlot, Condition, AndCondition, OrCondition, Operator }; | ||
export { Environment, ResourceRequest, DimensionRecordRequest, ReservationRequest, ResourceResult, ReservationResult, SObject, Reservation, Resource, Contact, Lead, Service, ServiceReservation, TimeSlot, AvailabilitySlotType, AvailabilityTimeSlot, ServiceTimeSlot, Condition, AndCondition, OrCondition, Operator, TimeSlotConfiguration }; | ||
export default GoMeddo; |
@@ -17,2 +17,4 @@ import GoMeddoAPI from './api/gomeddo-api-requests'; | ||
import { Condition, AndCondition, OrCondition, Operator } from './filters/conditions'; | ||
import DimensionRecordRequest from './dimension-record-request'; | ||
import TimeSlotConfiguration from './utils/time-slot-configuration'; | ||
var Environment; | ||
@@ -46,2 +48,10 @@ (function (Environment) { | ||
/** | ||
* Creates a new request for resources. The request can then be specified using methods on the resource request. | ||
* | ||
* @returns new resource request using the authentication from this GoMeddo instance | ||
*/ | ||
buildDimensionRecordRequest(dimensionName) { | ||
return new DimensionRecordRequest(this.api, dimensionName); | ||
} | ||
/** | ||
* Creates a new request for reservations. The request can then be specified using methods on the reservation request. | ||
@@ -185,3 +195,3 @@ * | ||
GoMeddo.version = '0.0.5'; | ||
export { Environment, ResourceRequest, ReservationRequest, ResourceResult, ReservationResult, SObject, Reservation, Resource, Contact, Lead, Service, ServiceReservation, TimeSlot, AvailabilitySlotType, AvailabilityTimeSlot, ServiceTimeSlot, Condition, AndCondition, OrCondition, Operator }; | ||
export { Environment, ResourceRequest, DimensionRecordRequest, ReservationRequest, ResourceResult, ReservationResult, SObject, Reservation, Resource, Contact, Lead, Service, ServiceReservation, TimeSlot, AvailabilitySlotType, AvailabilityTimeSlot, ServiceTimeSlot, Condition, AndCondition, OrCondition, Operator, TimeSlotConfiguration }; | ||
export default GoMeddo; |
@@ -0,4 +1,4 @@ | ||
import ResourceResult from './resource-result'; | ||
import DimensionRecordRequest from './dimension-record-request'; | ||
import GoMeddoAPI from './api/gomeddo-api-requests'; | ||
import ResourceResult from './resource-result'; | ||
import { ConditionElement } from './filters/conditions'; | ||
/** | ||
@@ -8,11 +8,5 @@ * Resource request by default will request all resources in an org. | ||
*/ | ||
export default class ResourceRequest { | ||
private readonly api; | ||
private readonly standardFields; | ||
private readonly additionalFields; | ||
export default class ResourceRequest extends DimensionRecordRequest { | ||
private readonly parents; | ||
private readonly types; | ||
private condition; | ||
private startOfRange; | ||
private endOfRange; | ||
private fetchServices; | ||
@@ -36,33 +30,2 @@ constructor(api: GoMeddoAPI); | ||
/** | ||
* Filter the resources on field values using conditions. | ||
* | ||
* @param conditions The conditions to filter on. Multiple conditions wil be combined using AND. | ||
* @returns The updated resource request. | ||
*/ | ||
withCondition(...conditions: ConditionElement[]): ResourceRequest; | ||
/** | ||
* Request an additional field to be returned for the resources | ||
* | ||
* @param fieldName The api name of the field to request | ||
* @returns The updated resource request. | ||
*/ | ||
includeAdditionalField(fieldName: string): ResourceRequest; | ||
/** | ||
* Request additional fields to be returned for the resources | ||
* | ||
* @param fieldName The api names of the fields to request | ||
* @returns The updated resource request. | ||
*/ | ||
includeAdditionalFields(fieldNames: Set<string> | string[]): ResourceRequest; | ||
/** | ||
* Request on resources that are not fully booked between the two datetime. | ||
* The input datetimes are interpeted in GMT | ||
* When this is requested timeslots for the requested range are provided for each resource. | ||
* | ||
* @param startOfRange The start of the timeslot range | ||
* @param endOfRange The end of the timeslot range | ||
* @returns The updated resource request. | ||
*/ | ||
withAvailableSlotsBetween(startOfRange: Date, endOfRange: Date): ResourceRequest; | ||
/** | ||
* Also fetch the services including slot for when the services are available | ||
@@ -82,3 +45,2 @@ * Only valid if withAvailableSlotsBetween has also been called. | ||
private getStartingResourceScope; | ||
private getRequestedFields; | ||
} |
import AvailabilityTimeSlotRequest from './api/request-bodies/availability-request'; | ||
import ServiceTimeSlotRequest from './api/request-bodies/service-availability-request'; | ||
import ResourceResult from './resource-result'; | ||
import { AndCondition, OrCondition, Condition, Operator } from './filters/conditions'; | ||
import { AndCondition, Condition, Operator, OrCondition } from './filters/conditions'; | ||
import { isSalesforceId } from './utils/salesforce-utils'; | ||
import FindAvailableIdsRequest from './find-available-ids-request'; | ||
import DimensionRecordRequest from './dimension-record-request'; | ||
/** | ||
@@ -10,14 +12,11 @@ * Resource request by default will request all resources in an org. | ||
*/ | ||
export default class ResourceRequest { | ||
export default class ResourceRequest extends DimensionRecordRequest { | ||
constructor(api) { | ||
super(api, 'B25__Resource__c'); | ||
this.parents = new Set(); | ||
this.types = new Set(); | ||
this.fetchServices = false; | ||
this.standardFields = new Set([ | ||
'Id', 'Name', 'B25__Resource_Type__c', 'B25__Parent__c' | ||
]); | ||
this.additionalFields = new Set(); | ||
this.parents = new Set(); | ||
this.types = new Set(); | ||
this.startOfRange = null; | ||
this.endOfRange = null; | ||
this.fetchServices = false; | ||
this.api = api; | ||
} | ||
@@ -46,54 +45,2 @@ /** | ||
/** | ||
* Filter the resources on field values using conditions. | ||
* | ||
* @param conditions The conditions to filter on. Multiple conditions wil be combined using AND. | ||
* @returns The updated resource request. | ||
*/ | ||
withCondition(...conditions) { | ||
if (this.condition === undefined) { | ||
this.condition = new OrCondition([]); | ||
} | ||
if (conditions.length === 1) { | ||
this.condition.conditions.push(conditions[0]); | ||
} | ||
else { | ||
this.condition.conditions.push(new AndCondition(conditions)); | ||
} | ||
return this; | ||
} | ||
/** | ||
* Request an additional field to be returned for the resources | ||
* | ||
* @param fieldName The api name of the field to request | ||
* @returns The updated resource request. | ||
*/ | ||
includeAdditionalField(fieldName) { | ||
this.additionalFields.add(fieldName); | ||
return this; | ||
} | ||
/** | ||
* Request additional fields to be returned for the resources | ||
* | ||
* @param fieldName The api names of the fields to request | ||
* @returns The updated resource request. | ||
*/ | ||
includeAdditionalFields(fieldNames) { | ||
fieldNames.forEach(fieldName => this.includeAdditionalField(fieldName)); | ||
return this; | ||
} | ||
/** | ||
* Request on resources that are not fully booked between the two datetime. | ||
* The input datetimes are interpeted in GMT | ||
* When this is requested timeslots for the requested range are provided for each resource. | ||
* | ||
* @param startOfRange The start of the timeslot range | ||
* @param endOfRange The end of the timeslot range | ||
* @returns The updated resource request. | ||
*/ | ||
withAvailableSlotsBetween(startOfRange, endOfRange) { | ||
this.startOfRange = startOfRange; | ||
this.endOfRange = endOfRange; | ||
return this; | ||
} | ||
/** | ||
* Also fetch the services including slot for when the services are available | ||
@@ -117,2 +64,8 @@ * Only valid if withAvailableSlotsBetween has also been called. | ||
const resourceResult = new ResourceResult(resources); | ||
if (this.reservation !== null) { | ||
const resourceIds = resourceResult.getResourceIds(); | ||
const dimension = new FindAvailableIdsRequest('B25__Resource__c', resourceIds, null, this.reservation.getSFSObject()); | ||
const availableDimensionIds = await this.api.findAvailableDimensionIds(dimension); | ||
resourceResult.filterResourcesById(availableDimensionIds); | ||
} | ||
if (this.startOfRange !== null && this.endOfRange !== null) { | ||
@@ -134,14 +87,14 @@ const availabilityData = await this.api.getAvailability(new AvailabilityTimeSlotRequest(this.startOfRange, this.endOfRange, resourceResult.getResourceIds())); | ||
} | ||
let condition = this.condition; | ||
let condition = new AndCondition([]); | ||
if (this.types.size !== 0) { | ||
condition = new AndCondition([...this.types].map(type => new Condition('B25__Resource_Type__r.Name', Operator.EQUAL, type))); | ||
if (this.condition !== undefined) { | ||
condition.conditions.push(this.condition); | ||
} | ||
condition.conditions.push(new OrCondition([...this.types].map(type => new Condition('B25__Resource_Type__r.Name', Operator.EQUAL, type)))); | ||
} | ||
return await this.api.searchResources(parentIds, parentNames, condition === null || condition === void 0 ? void 0 : condition.getAPICondition(), this.getRequestedFields()); | ||
if (this.condition !== undefined) { | ||
condition.conditions.push(this.condition); | ||
} | ||
if (condition.conditions.length === 0) { | ||
condition = undefined; | ||
} | ||
return (await this.api.searchDimensionRecords(parentIds, parentNames, condition === null || condition === void 0 ? void 0 : condition.getAPICondition(), this.getRequestedFields(), 'B25__Resource__c')); | ||
} | ||
getRequestedFields() { | ||
return new Set([...this.standardFields, ...this.additionalFields]); | ||
} | ||
} |
import AvailabilityTimeSlotResponse from './api/availability-reponse'; | ||
import ServiceTimeSlotResponse from './api/service-availability-response'; | ||
import DimensionRecordResult from './dimension-record-result'; | ||
import Resource, { SFResource } from './s-objects/resource'; | ||
@@ -7,7 +8,7 @@ /** | ||
*/ | ||
export default class ResourceResult { | ||
export default class ResourceResult extends DimensionRecordResult { | ||
private readonly resourcesById; | ||
constructor(sfResourceData: SFResource[]); | ||
computeTreeStructure(): ResourceResult; | ||
addAvailabilitySlotData(dimensionsSlotData: AvailabilityTimeSlotResponse[]): void; | ||
addAvailabilitySlotData(resourceSlotData: AvailabilityTimeSlotResponse[]): void; | ||
addServiceSlotData(dimensionsServiceSlotData: ServiceTimeSlotResponse[]): void; | ||
@@ -27,2 +28,9 @@ /** | ||
getResource(idOrName: string): Resource | undefined; | ||
/** | ||
* Filters the resources in the `resourcesById` map based on the allowed ids. | ||
* @internal | ||
* @param resourceIds The ids of the resources that are allowed to remain in the map. | ||
* @returns void | ||
*/ | ||
filterResourcesById(resourceIds: string[]): void; | ||
} |
@@ -0,1 +1,2 @@ | ||
import DimensionRecordResult from './dimension-record-result'; | ||
import Resource from './s-objects/resource'; | ||
@@ -6,4 +7,5 @@ import { isSalesforceId } from './utils/salesforce-utils'; | ||
*/ | ||
export default class ResourceResult { | ||
export default class ResourceResult extends DimensionRecordResult { | ||
constructor(sfResourceData) { | ||
super(sfResourceData); | ||
// Map all resources to their ids | ||
@@ -31,4 +33,4 @@ this.resourcesById = sfResourceData.reduce((map, sfResourceData) => { | ||
} | ||
addAvailabilitySlotData(dimensionsSlotData) { | ||
dimensionsSlotData.forEach((slotData) => { | ||
addAvailabilitySlotData(resourceSlotData) { | ||
resourceSlotData.forEach((slotData) => { | ||
const matchingResource = this.resourcesById.get(slotData.dimensionId); | ||
@@ -75,2 +77,15 @@ if (matchingResource === undefined) { | ||
} | ||
/** | ||
* Filters the resources in the `resourcesById` map based on the allowed ids. | ||
* @internal | ||
* @param resourceIds The ids of the resources that are allowed to remain in the map. | ||
* @returns void | ||
*/ | ||
filterResourcesById(resourceIds) { | ||
this.resourcesById.forEach((resource, id) => { | ||
if (!resourceIds.includes(id)) { | ||
this.resourcesById.delete(id); | ||
} | ||
}); | ||
} | ||
} |
@@ -1,11 +0,9 @@ | ||
import AvailabilityTimeSlotResponse from '../api/availability-reponse'; | ||
import SObject, { CustomSFSObject } from './s-object'; | ||
import { AvailabilityTimeSlot } from '../time-slots/availability-time-slot'; | ||
import { CustomSFSObject } from './s-object'; | ||
import Service from './service'; | ||
import ServiceTimeSlotResponse from '../api/service-availability-response'; | ||
import DimensionRecord from '../dimension-record'; | ||
/** | ||
* A Resource | ||
*/ | ||
export default class Resource extends SObject { | ||
name: string; | ||
export default class Resource extends DimensionRecord { | ||
parentId: string | null; | ||
@@ -15,11 +13,5 @@ parent: Resource | null; | ||
services: Map<string, Service>; | ||
private timeSlots; | ||
constructor(parsedResource: SFResource); | ||
/** | ||
* @internal | ||
* Adds availability slot data for this resource to the resource. | ||
*/ | ||
addAvailabilitySlotData(slotData: AvailabilityTimeSlotResponse): void; | ||
/** | ||
* @internal | ||
* Adds service availability slot data for this resource to the resource. | ||
@@ -34,7 +26,2 @@ */ | ||
/** | ||
* Gets the timeslots for this resource. Only available if withAvailableSlotsBetween was called. | ||
* @return The timeslots for this resource. | ||
*/ | ||
getTimeSlots(): AvailabilityTimeSlot[]; | ||
/** | ||
* Gets the available service for this resource. Only available if withAvailableSlotsBetween, and includeServices were called. | ||
@@ -41,0 +28,0 @@ * @return The available services for this resource. |
@@ -1,8 +0,8 @@ | ||
import SObject from './s-object'; | ||
import { AvailabilitySlotType } from '../time-slots/availability-time-slot'; | ||
import { isSalesforceId } from '../utils/salesforce-utils'; | ||
import DimensionRecord from '../dimension-record'; | ||
/** | ||
* A Resource | ||
*/ | ||
export default class Resource extends SObject { | ||
export default class Resource extends DimensionRecord { | ||
constructor(parsedResource) { | ||
@@ -14,3 +14,2 @@ var _a; | ||
this.services = new Map(); | ||
this.timeSlots = []; | ||
this.name = parsedResource.Name; | ||
@@ -21,9 +20,2 @@ this.parentId = (_a = parsedResource.B25__Parent__c) !== null && _a !== void 0 ? _a : null; | ||
* @internal | ||
* Adds availability slot data for this resource to the resource. | ||
*/ | ||
addAvailabilitySlotData(slotData) { | ||
this.timeSlots = slotData.timeSlots; | ||
} | ||
/** | ||
* @internal | ||
* Adds service availability slot data for this resource to the resource. | ||
@@ -42,9 +34,2 @@ */ | ||
/** | ||
* Gets the timeslots for this resource. Only available if withAvailableSlotsBetween was called. | ||
* @return The timeslots for this resource. | ||
*/ | ||
getTimeSlots() { | ||
return this.timeSlots; | ||
} | ||
/** | ||
* Gets the available service for this resource. Only available if withAvailableSlotsBetween, and includeServices were called. | ||
@@ -51,0 +36,0 @@ * @return The available services for this resource. |
{ | ||
"name": "@gomeddo/sdk", | ||
"version": "0.0.6", | ||
"version": "0.0.7", | ||
"description": "Package allowing for the easy use of GoMeddo APIs.", | ||
@@ -14,2 +14,3 @@ "keywords": [ | ||
"scripts": { | ||
"release": "yarn build && yarn publish --access public", | ||
"build": "yarn build:cjs && yarn build:esm", | ||
@@ -16,0 +17,0 @@ "build:cjs": "tsc --project tsconfig.build.json", |
267644
6380
18