Skip to content

Instantly share code, notes, and snippets.

@robpetty
Created November 26, 2023 06:54
Show Gist options
  • Save robpetty/c9d895220ccdb764c346669258f09e8d to your computer and use it in GitHub Desktop.
Save robpetty/c9d895220ccdb764c346669258f09e8d to your computer and use it in GitHub Desktop.
Simple Shippo API Client Wrapper
export default class ShippoClient {
private apiToken: string;
private basePath: string;
protected addresses: string;
protected shipments: string;
protected transactions: string;
constructor(config: any) {
this.apiToken = config.api_key;
this.basePath = "https://api.goshippo.com";
// set API paths
this.addresses = `addresses`;
this.shipments = `shipments`;
this.transactions = `transactions`;
}
async request(url = "", config: any = {}) {
let response = null;
try {
if (config.method == "GET") {
response = await fetch(url, {
method: "GET",
headers: {
"Content-Type": "application/json",
Authorization: `ShippoToken ${this.apiToken}`,
},
});
} else if (config.method == "POST") {
response = await fetch(url, {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `ShippoToken ${this.apiToken}`,
},
body: JSON.stringify(config.body),
});
}
if (response !== null) {
if (!response.ok) {
console.log(response);
throw new Error(`Shippo API error: ${response.statusText}`);
}
return await response.json();
}
} catch (error) {
//this.handleApiError(error);
throw error;
}
}
async getAddress(addressId: any) {
let url = `${this.basePath}/${this.addresses}/${addressId}`;
let config = {
method: "GET",
};
return await this.request(url, config);
}
async validateAddress(addressId: any) {
let url = `${this.basePath}/${this.addresses}/${addressId}/validate`;
let config = {
method: "GET",
};
return await this.request(url, config);
}
async createAddress(address: any) {
let url = `${this.basePath}/${this.addresses}`;
let config = {
method: "POST",
body: address,
};
return await this.request(url, config);
}
async createShippoShipment(addressFrom: any, addressTo: any, parcel: any) {
let url = `${this.basePath}/${this.shipments}`;
let config = {
method: "POST",
body: {
address_from: addressFrom,
address_to: addressTo,
parcels: [parcel],
async: false,
},
};
return await this.request(url, config);
}
async createShippoTransaction(rateId: string, labelFileType: string) {
let url = `${this.basePath}/${this.transactions}`;
let config = {
method: "POST",
body: {
rate: rateId,
label_file_type: labelFileType,
async: false,
},
};
return await this.request(url, config);
}
}
var addresser = require("addresser");
import ShippoClient from "@/utils/shippo-client/client";
let shippoClient = new ShippoClient({
api_key: process.env.SHIPPO_TEST_TOKEN,
});
export function shippoMapAddresserToShippoFormat(
name: string,
parsedAddress: any,
) {
let shippoAddress = {
name: name,
street1: parsedAddress.addressLine1,
street2: parsedAddress.addressLine2,
city: parsedAddress.placeName,
state: parsedAddress.stateAbbreviation,
country: "US",
zip: parsedAddress.zipCode,
};
return shippoAddress;
}
// TODO: Review and clean up.
export async function shippoCreateOrUpdateAddress(
displayName: string,
address: string,
) {
//let result = null;
// generalized parsing
let parsedAddress = addresser.parseAddress(address);
// convert to Shippo format, Shippo requires address_to.name
parsedAddress = shippoMapAddresserToShippoFormat(displayName, parsedAddress);
// must create before you can validate
let result = await shippoClient.createAddress(parsedAddress);
//let temp = await shippoClient.getAddress(result.object_id);
let validAddress = await shippoClient.validateAddress(result.object_id);
// To see results from Shippo validating US addresses need to create before validating
console.log(validAddress);
console.log(result);
return result;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment