Skip to main content

Preoperation Overview

Preoperations are preparatory steps required by the supplier before executing a main operation (see Operation Overview).

These preoperations follow the same structure as regular operations and implement the IPre<Operation>Operations<SupplierRequest, SupplierResponse, Binder> interface. Preoperations can be applied to Search, Quote, Book, CheckBookingsByReference, CheckBookingsByDates, or Cancel.

Adding a Preoperationโ€‹

To register a preoperation, use the appropriate service extensions based on the operation type. For example, for a Quote preoperation:

services.AddPreQuoteOperation<PriceOperation, PriceRq, PriceRs, CvcAccessModel>();

Specify the serializer to use for the request and response format (e.g., JSON, XML, or a custom serializer):

services.AddJsonSerializer<PriceRq, PriceRs>(_ => { });

Key Notesโ€‹

  • Purpose: Preoperations are crucial when suppliers require additional preparatory steps, such as fetching tokens or rules, before the main operation.
  • Flexibility: Use IContextCache to streamline data sharing across operations, reducing redundant calls.
  • Modular Integration: Register preoperations and serializers in the service collection, ensuring seamless integration with the Connector's architecture.

Example Preoperation: Quoteโ€‹

The following example demonstrates a Quote preoperation:

public partial class PriceOperation(IContextCache contextCache, ICancelPenaltyManager cancelPenaltyManager)
: IPreQuoteOperations<PriceRq, PriceRs, CvcAccessModel>
{
public bool TryValidateModelRequest(
QuoteConnectorRequest connectorsRequest, QuoteParameters<CvcAccessModel> connectorParameters,
out IEnumerable<AdviseMessage> adviseMessages)
{
adviseMessages = default;
return true;
}

public bool TryValidateSupplierResponses(
QuoteParameters<CvcAccessModel> connectorParameters, IEnumerable<SupplierResponseWrapper<PriceRs>> supplierResponses,
out IEnumerable<AdviseMessage> adviseMessages)
{
return supplierResponses.TryValidateSupplierResponses(out adviseMessages);
}

public IEnumerable<SupplierRequestWrapper<PriceRq>> BuildRequests(
QuoteConnectorRequest connectorsRequest, QuoteParameters<CvcAccessModel> connectorParameters)
{
// Implement request-building logic here
}
}

Sharing Data Between Preoperations and Operationsโ€‹

To pass data between a preoperation and the main operation (or another preoperation), the IContextCache class is used. This class allows you to store and retrieve custom data objects.

Injecting IContextCacheโ€‹

The IContextCache instance is injected into the constructor via Dependency Injection:

public partial class PriceOperation : IPreQuoteOperations<PriceRq, PriceRs, CvcAccessModel>
{
private readonly IContextCache _contextCache;
private readonly ICancelPenaltyManager _cancelPenaltyManager;

public PriceOperation(IContextCache contextCache, ICancelPenaltyManager cancelPenaltyManager)
{
_contextCache = contextCache;
_cancelPenaltyManager = cancelPenaltyManager;
}
}

Adding Data to IContextCacheโ€‹

Data can be added to the context cache in the ParseResponses method:

public QuoteConnectorResponse ParseResponses(
QuoteConnectorRequest connectorsRequest, QuoteParameters<CvcAccessModel> connectorParameters,
IEnumerable<SupplierResponseWrapper<PriceRs>> supplierResponses, CancellationToken cancellationToken)
{
var firstResponse = supplierResponses.First().Response;

var data = new Dictionary<uint, List<CancellationPolicy>>();
foreach (var bookingRule in firstResponse.BookingRules)
{
data.Add((uint)bookingRule.ProductTokenIndex, bookingRule.CancellationPolicies);
}

_contextCache.TryAdd(data);

return new QuoteConnectorResponse(new QuoteRs(default, default, default, PaymentType.MerchantPay));
}

Retrieving Data from IContextCacheโ€‹

Data stored in the cache can be retrieved in another operation or preoperation:

_contextCache.TryGet<LoginTokenData>(out var response);