Skip to content

Commit e0de7ed

Browse files
authored
Merge pull request #640 from duffelhq/post-booking-services
feat(booking): add ability to retrieve and add services for an order
2 parents 0f873e3 + acc45a4 commit e0de7ed

File tree

4 files changed

+93
-1
lines changed

4 files changed

+93
-1
lines changed

src/booking/Orders/Orders.spec.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
import nock from 'nock'
22
import { Client } from '../../Client'
33
import {
4+
mockAddServicesRequest,
45
mockCreateOrderRequest,
56
mockOnHoldOrders,
67
mockOrder,
8+
mockServices,
79
} from './mockOrders'
810
import { Orders } from './Orders'
911

@@ -168,4 +170,28 @@ describe('Orders', () => {
168170
1
169171
)
170172
})
173+
174+
test('should get available services for an order', async () => {
175+
nock(/(.*)/)
176+
.get(`/air/orders/${mockOrder.id}/available_services`)
177+
.reply(200, { data: mockServices })
178+
179+
const response = await new Orders(
180+
new Client({ token: 'mockToken' })
181+
).getAvailableServices(mockOrder.id)
182+
183+
expect(response.data[0].id).toBe(mockServices[0].id)
184+
})
185+
186+
test('should add services to an order', async () => {
187+
nock(/(.*)/)
188+
.post(`/air/orders/${mockOrder.id}/services`)
189+
.reply(200, { data: { ...mockOrder, services: mockServices } })
190+
191+
const response = await new Orders(
192+
new Client({ token: 'mockToken' })
193+
).addServices(mockOrder.id, mockAddServicesRequest)
194+
195+
expect(response.data.services[0].id).toBe(mockServices[0].id)
196+
})
171197
})

src/booking/Orders/Orders.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
import { Resource } from '../../Resource'
22
import {
3+
AddServices,
34
CreateOrder,
45
DuffelResponse,
56
ListParamsOrders,
67
Order,
8+
OrderAvailableService,
79
PaginationMeta,
810
UpdateSingleOrder,
911
} from '../../types'
@@ -74,4 +76,32 @@ export class Orders extends Resource {
7476
data: { options },
7577
})
7678
}
79+
80+
/**
81+
* Retrieves the available services for an order by its ID
82+
* @param {string} id - Duffel's unique identifier for the order
83+
*/
84+
public getAvailableServices = async (
85+
id: string
86+
): Promise<DuffelResponse<OrderAvailableService[]>> =>
87+
this.request({
88+
method: 'GET',
89+
path: `${this.path}/${id}/available_services`,
90+
})
91+
92+
/**
93+
* Adds services for an order by its ID
94+
* @param {string} id - Duffel's unique identifier for the order
95+
* @param {Object.AddServices} options
96+
* @link https://duffel.com/docs/api/orders/create-order-services
97+
*/
98+
public addServices = async (
99+
id: string,
100+
options: AddServices
101+
): Promise<DuffelResponse<Order>> =>
102+
this.request({
103+
method: 'POST',
104+
path: `${this.path}/${id}/services`,
105+
data: { options },
106+
})
77107
}

src/booking/Orders/OrdersTypes.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import {
77
DuffelPassengerType,
88
FlightsConditions,
99
LoyaltyProgrammeAccount,
10+
OfferAvailableService,
1011
OfferAvailableServiceBaggageMetadata,
1112
PassengerIdentityDocumentType,
1213
PaymentType,
@@ -561,3 +562,10 @@ export interface ListParamsOrders {
561562
export interface UpdateSingleOrder {
562563
metadata: Order['metadata']
563564
}
565+
566+
export interface AddServices {
567+
payments: OrderPayment[]
568+
add_services: Pick<OrderService, 'id' | 'quantity'>[]
569+
}
570+
571+
export type OrderAvailableService = OfferAvailableService

src/booking/Orders/mockOrders.ts

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
1-
import { CreateOrder, Order } from '../../types'
1+
import {
2+
AddServices,
3+
CreateOrder,
4+
Order,
5+
OrderAvailableService,
6+
} from '../../types'
27

38
export const mockCreateOrderRequest: CreateOrder = {
49
type: 'instant',
@@ -568,3 +573,26 @@ export const mockOnHoldOrders: Order[] = [
568573
base_amount: '93.00',
569574
},
570575
]
576+
577+
export const mockServices: OrderAvailableService[] = [
578+
{
579+
type: 'baggage',
580+
total_currency: 'GBP',
581+
total_amount: '15.00',
582+
segment_ids: ['seg_00009hj8USM7Ncg31cB456'],
583+
passenger_ids: ['pas_00009hj8USM7Ncg31cBCLL'],
584+
maximum_quantity: 1,
585+
id: 'aso_00009UhD4ongolulWd9123',
586+
},
587+
]
588+
589+
export const mockAddServicesRequest: AddServices = {
590+
payments: [
591+
{
592+
type: 'balance',
593+
currency: 'GBP',
594+
amount: '30.20',
595+
},
596+
],
597+
add_services: [{ id: 'aso_00009UhD4ongolulWd9123', quantity: 1 }],
598+
}

0 commit comments

Comments
 (0)