Skip to content

Commit 13fde01

Browse files
authored
Merge pull request #144 from hopinc/webhook-data-types
webhook types
2 parents 899b665 + 89a52dd commit 13fde01

File tree

5 files changed

+90
-38
lines changed

5 files changed

+90
-38
lines changed

.changeset/dirty-dragons-heal.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@onehop/js': minor
3+
---
4+
5+
Add types for event data and removes unimplemented events.

src/rest/types/ignite.ts

+7-5
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,12 @@ export interface VolumeDefinition {
132132
mount_path: string;
133133
}
134134

135+
export interface ContainerMetrics {
136+
cpu_usage_percent: number;
137+
memory_usage_percent: number;
138+
memory_usage_bytes: number;
139+
}
140+
135141
/**
136142
* The definition of a container
137143
* @public
@@ -165,11 +171,7 @@ export interface Container {
165171
/**
166172
* Metrics for this container
167173
*/
168-
metrics: {
169-
cpu_usage_percent: number;
170-
memory_usage_percent: number;
171-
memory_usage_bytes: number;
172-
} | null;
174+
metrics: ContainerMetrics | null;
173175

174176
/**
175177
* Information about the container

src/rest/types/projects.ts

+74-30
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,15 @@ import type {
55
Timestamp,
66
} from '../../util/types.ts';
77
import type {Endpoint} from '../endpoints.ts';
8+
import type {
9+
Build,
10+
Container,
11+
ContainerMetrics,
12+
Deployment,
13+
DeploymentRollout,
14+
Gateway,
15+
HealthCheck,
16+
} from './ignite.ts';
817
import type {User} from './users.ts';
918

1019
/**
@@ -249,38 +258,73 @@ export interface Webhook {
249258
/**
250259
* An event is sent from a webhook to an endpoint
251260
*/
252-
export interface Event<T extends PossibleWebhookIDs = PossibleWebhookIDs> {
253-
/**
254-
* The ID of the webhook that sent this event
255-
*/
256-
webhook_id: Id<'webhook'>;
257-
/**
258-
* The ID of the project that this event is for
259-
*/
260-
project_id: Id<'project'>;
261-
/**
262-
* The time this event occurred at
263-
*/
264-
occurred_at: string;
265-
/**
266-
* The ID of the event
267-
*/
268-
id: Id<'event'>;
269-
/**
270-
* The event that occurred
271-
* @example ignite.deployment.container.updated
272-
*/
273-
event: T;
274-
/**
275-
* The data for this event
276-
*/
277-
data: unknown;
261+
262+
export interface HealthCheckEventUpdate {
263+
state: 'failed' | 'succeeded' | 'pending';
264+
container_id: string;
265+
deployment_id: string;
278266
}
279267

280-
/**
281-
* The endpoints for projects
282-
* @public
283-
*/
268+
export type EventDataMap = {
269+
'ignite.deployment.container.updated': Container;
270+
'ignite.deployment.container.created': Container;
271+
'ignite.deployment.container.deleted': Container;
272+
'ignite.deployment.created': Deployment;
273+
'ignite.deployment.updated': Deployment;
274+
'ignite.deployment.deleted': Deployment;
275+
'ignite.deployment.build.created': Build;
276+
'ignite.deployment.build.updated': Build;
277+
'ignite.deployment.rollout.created': DeploymentRollout;
278+
'ignite.deployment.rollout.updated': DeploymentRollout;
279+
'ignite.deployment.container.metrics_update': ContainerMetrics;
280+
'ignite.deployment.healthcheck.created': HealthCheck;
281+
'ignite.deployment.healthcheck.updated': HealthCheck;
282+
'ignite.deployment.healthcheck.deleted': HealthCheck;
283+
'ignite.deployment.healthcheck.events.failed': HealthCheckEventUpdate;
284+
'ignite.deployment.healthcheck.events.succeeded': HealthCheckEventUpdate;
285+
'ignite.deployment.gateway.created': Gateway;
286+
'ignite.deployment.gateway.updated': Gateway;
287+
'ignite.deployment.gateway.deleted': Gateway;
288+
'project.updated': Project;
289+
'project.member.created': Member;
290+
'project.member.updated': Member;
291+
'project.member.deleted': Member;
292+
'project.tokens.created': ProjectToken;
293+
'project.tokens.deleted': ProjectToken;
294+
'project.secrets.created': Secret;
295+
'project.secrets.updated': Secret;
296+
'project.secrets.deleted': Secret;
297+
[key: string]: unknown;
298+
};
299+
300+
type Events<E> = E[keyof E];
301+
302+
export type Event = Events<{
303+
[Key in PossibleWebhookIDs]: {
304+
webhook_id: Id<'webhook'>;
305+
/**
306+
* The ID of the project that this event is for
307+
*/
308+
project_id: Id<'project'>;
309+
/**
310+
* The time this event occurred at
311+
*/
312+
occurred_at: string;
313+
/**
314+
* The ID of the event
315+
*/
316+
id: Id<'event'>;
317+
/**
318+
* The event that occurred
319+
*/
320+
event: Key;
321+
/**
322+
* The data the belongs to the event
323+
*/
324+
data: EventDataMap[Key];
325+
};
326+
}>;
327+
284328
export type ProjectsEndpoints =
285329
| Endpoint<
286330
'DELETE',

src/util/webhooks.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ import type {Event} from '..';
22
import {crypto} from './crypto';
33

44
export const POSSIBLE_EVENTS = {
5-
Channels: [
5+
// These are not yet implemented
6+
/* Channels: [
67
{
78
id: 'channel.created',
89
name: 'Created',
@@ -23,7 +24,7 @@ export const POSSIBLE_EVENTS = {
2324
id: 'channel.client.disconnected',
2425
name: 'Client Disconnected',
2526
},
26-
],
27+
], */
2728
Ignite: [
2829
{
2930
id: 'ignite.deployment.created',

tests/projects/webhooks.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ export function webhookTests(hop: Hop) {
88
test('It creates a webhook', async () => {
99
const webhook = await hop.projects.webhooks.create(
1010
'https://example.com/webhook',
11-
['ignite.deployment.build.cancelled', 'channel.client.disconnected'],
11+
['ignite.deployment.build.cancelled', 'ignite.deployment.build.created'],
1212
);
1313

1414
assert.ok(

0 commit comments

Comments
 (0)