@lineai/gov-deals
Version:
Explore Federal contracts for government building renovations, city hall renovations, courthouse updates, library modernizations, federal building improvement contracts, base housing and facilities upgrades.
87 lines • 5.96 kB
JavaScript
/**
* Wrapper to make SamApi work with Supabase Edge Functions
* Converts query parameter authentication to header authentication
*/
import { OpportunitiesEndpoint } from './sam/endpoints/opportunities';
import axios from 'axios';
import { ApiError, AuthenticationError } from '../core/errors';
/**
* Custom client that sends API key in headers instead of query params
*/
class SupabaseClient {
axios;
constructor(apiKey, baseUrl) {
this.axios = axios.create({
baseURL: baseUrl,
timeout: 30000,
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
'apikey': apiKey,
'Authorization': `Bearer ${apiKey}`,
},
});
// Intercept requests to remove api_key from query params
this.axios.interceptors.request.use((config) => {
if (config.params?.api_key) {
delete config.params.api_key;
}
return config;
});
}
async get(path, params) {
try {
const response = await this.axios.get(path, { params });
return response.data;
}
catch (error) {
this.handleError(error);
}
}
async post(path, data, params) {
try {
const response = await this.axios.post(path, data, { params });
return response.data;
}
catch (error) {
this.handleError(error);
}
}
handleError(error) {
if (axios.isAxiosError(error)) {
const status = error.response?.status;
const message = error.response?.data?.error || error.response?.data?.message || error.message;
if (status === 401 || status === 403) {
throw new AuthenticationError(`Authentication failed: ${message}`);
}
throw new ApiError(`API error: ${message}`, status, error.response?.data);
}
throw error;
}
}
/**
* Supabase-compatible API wrapper
* Use this instead of SamApi when connecting to Supabase Edge Functions
*/
export class SupabaseApi {
client;
opportunities;
constructor(options) {
this.client = new SupabaseClient(options.apiKey, options.baseUrl);
this.opportunities = new OpportunitiesEndpoint(this.client);
}
}
/**
* Helper function to create Supabase-compatible API instance
*/
export function createSupabaseApi(supabaseUrl, supabaseAnonKey) {
// Ensure the URL includes /functions/v1/api
const baseUrl = supabaseUrl.includes('/functions/v1')
? supabaseUrl
: `${supabaseUrl}/functions/v1/api`;
return new SupabaseApi({
apiKey: supabaseAnonKey,
baseUrl: baseUrl,
});
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VwYWJhc2Utd3JhcHBlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jbGllbnRzL3N1cGFiYXNlLXdyYXBwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDdEUsT0FBTyxLQUF3QixNQUFNLE9BQU8sQ0FBQztBQUM3QyxPQUFPLEVBQUUsUUFBUSxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFL0Q7O0dBRUc7QUFDSCxNQUFNLGNBQWM7SUFDRCxLQUFLLENBQWdCO0lBRXRDLFlBQVksTUFBYyxFQUFFLE9BQWU7UUFDekMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO1lBQ3hCLE9BQU8sRUFBRSxPQUFPO1lBQ2hCLE9BQU8sRUFBRSxLQUFLO1lBQ2QsT0FBTyxFQUFFO2dCQUNQLFFBQVEsRUFBRSxrQkFBa0I7Z0JBQzVCLGNBQWMsRUFBRSxrQkFBa0I7Z0JBQ2xDLFFBQVEsRUFBRSxNQUFNO2dCQUNoQixlQUFlLEVBQUUsVUFBVSxNQUFNLEVBQUU7YUFDcEM7U0FDRixDQUFDLENBQUM7UUFFSCx5REFBeUQ7UUFDekQsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQzdDLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUU7Z0JBQzFCLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7YUFDOUI7WUFDRCxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxLQUFLLENBQUMsR0FBRyxDQUFJLElBQVksRUFBRSxNQUE0QjtRQUNyRCxJQUFJO1lBQ0YsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBSSxJQUFJLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1lBQzNELE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQztTQUN0QjtRQUFDLE9BQU8sS0FBSyxFQUFFO1lBQ2QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUN6QjtJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsSUFBSSxDQUFJLElBQVksRUFBRSxJQUFjLEVBQUUsTUFBNEI7UUFDdEUsSUFBSTtZQUNGLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUksSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFDbEUsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDO1NBQ3RCO1FBQUMsT0FBTyxLQUFLLEVBQUU7WUFDZCxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3pCO0lBQ0gsQ0FBQztJQUVPLFdBQVcsQ0FBQyxLQUFVO1FBQzVCLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUM3QixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQztZQUN0QyxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxLQUFLLElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsT0FBTyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUM7WUFFOUYsSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7Z0JBQ3BDLE1BQU0sSUFBSSxtQkFBbUIsQ0FBQywwQkFBMEIsT0FBTyxFQUFFLENBQUMsQ0FBQzthQUNwRTtZQUVELE1BQU0sSUFBSSxRQUFRLENBQ2hCLGNBQWMsT0FBTyxFQUFFLEVBQ3ZCLE1BQU0sRUFDTixLQUFLLENBQUMsUUFBUSxFQUFFLElBQUksQ0FDckIsQ0FBQztTQUNIO1FBRUQsTUFBTSxLQUFLLENBQUM7SUFDZCxDQUFDO0NBQ0Y7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sV0FBVztJQUNMLE1BQU0sQ0FBaUI7SUFDeEIsYUFBYSxDQUF3QjtJQUVyRCxZQUFZLE9BQTRDO1FBQ3RELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxjQUFjLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbEUsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLHFCQUFxQixDQUFDLElBQUksQ0FBQyxNQUFhLENBQUMsQ0FBQztJQUNyRSxDQUFDO0NBQ0Y7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxXQUFtQixFQUFFLGVBQXVCO0lBQzVFLDRDQUE0QztJQUM1QyxNQUFNLE9BQU8sR0FBRyxXQUFXLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQztRQUNuRCxDQUFDLENBQUMsV0FBVztRQUNiLENBQUMsQ0FBQyxHQUFHLFdBQVcsbUJBQW1CLENBQUM7SUFFdEMsT0FBTyxJQUFJLFdBQVcsQ0FBQztRQUNyQixNQUFNLEVBQUUsZUFBZTtRQUN2QixPQUFPLEVBQUUsT0FBTztLQUNqQixDQUFDLENBQUM7QUFDTCxDQUFDIn0=