Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion .npmrc

This file was deleted.

18 changes: 18 additions & 0 deletions api/webhooks/dto/subscription-dto.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import { SubscriptionEvent } from "../params/subscription-event";
import { SubscriptionRequestHeader } from "../params/subscription-request-header";

interface SubscriptionDto {
subscriptionUid: string;
subscriptionName: string;
subscriptionUrl: string;
accountUid: string;
enabled: boolean;
userUid: string;
description: string | null;
createdDate: string;
requestHeaders: SubscriptionRequestHeader[];
events: SubscriptionEvent[];
projectUids: string[];
}

export { SubscriptionDto };
5 changes: 5 additions & 0 deletions api/webhooks/dto/subscription-secret-dto.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
interface SubscriptionSecretDto {
payloadSecret: string;
}

export { SubscriptionSecretDto };
Comment on lines +1 to +5
Copy link
Contributor

@PavelLoparev PavelLoparev Jul 10, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

no actions points: weird naming. it's already clear this secret is in payload.

8 changes: 8 additions & 0 deletions api/webhooks/dto/subscription-statistics-dto.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
interface SubscriptionStatisticsDto {
failEvents: number;
pendingEvents: number;
sendingEvents: number;
successEvents: number;
}

export { SubscriptionStatisticsDto };
9 changes: 9 additions & 0 deletions api/webhooks/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
export { SmartlingWebhooksApi } from "./smartling-webhooks-api";
export { SubscriptionDto } from "./dto/subscription-dto";
export { SubscriptionSecretDto } from "./dto/subscription-secret-dto";
export { SubscriptionEvent } from "./params/subscription-event";
export { CreateSubscriptionParameters } from "./params/create-subscription-parameters";
export { UpdateSubscriptionParameters } from "./params/update-subscription-parameters";
export { SubscriptionRequestHeader } from "./params/subscription-request-header";
export { UpdateSubscriptionSecretParameters } from "./params/update-subscription-secret-parameters";
export { GetSubscriptionEventsParameters } from "./params/get-subscription-events-parameters";
10 changes: 10 additions & 0 deletions api/webhooks/params/create-subscription-parameters.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { CreateUpdateSubscriptionParameters } from "./create-update-subscription-parameters";

export class CreateSubscriptionParameters
extends CreateUpdateSubscriptionParameters<CreateSubscriptionParameters> {
setPayloadSecret(payloadSecret: string): CreateSubscriptionParameters {
this.set("payloadSecret", payloadSecret);

return this;
}
}
72 changes: 72 additions & 0 deletions api/webhooks/params/create-update-subscription-parameters.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
import { BaseParameters } from "../../parameters";
import { SmartlingException } from "../../exception";
import { SubscriptionEvent } from "./subscription-event";
import { SubscriptionRequestHeader } from "./subscription-request-header";

const MAX_EVENTS_SIZE = 1000;
const MAX_SUBSCRIPTION_HEADERS_SIZE = 20;
const MAX_PROJECT_UIDS_SIZE = 10;

export abstract class CreateUpdateSubscriptionParameters<
T extends CreateUpdateSubscriptionParameters<T>
> extends BaseParameters {
constructor(
subscriptionName: string,
subscriptionUrl: string,
events: SubscriptionEvent[]
) {
super();

if (!subscriptionName) {
throw new SmartlingException("Subscription name is required.");
}

if (!subscriptionUrl) {
throw new SmartlingException("Subscription url is required.");
}

if (!events.length) {
throw new SmartlingException("At least one event is required.");
}

if (events.length > MAX_EVENTS_SIZE) {
throw new SmartlingException(`The request contains too many events: ${events.length}. Maximum allowed events number is ${MAX_EVENTS_SIZE}.`);
}

this.set("subscriptionName", subscriptionName);
this.set("subscriptionUrl", subscriptionUrl);
this.set("events", events);
}

setDescription(description: string): T {
this.set("description", description);

return this as unknown as T;
}

setRequestHeaders(requestHeaders: SubscriptionRequestHeader[]): T {
if (!requestHeaders.length) {
throw new SmartlingException("At least one subscription header is required.");
}

if (requestHeaders.length > MAX_SUBSCRIPTION_HEADERS_SIZE) {
throw new SmartlingException(`The request contains too many subscription headers: ${requestHeaders.length}. Maximum allowed subscription headers number is ${MAX_SUBSCRIPTION_HEADERS_SIZE}.`);
}

this.set("requestHeaders", requestHeaders);
return this as unknown as T;
}

setProjectUids(projectUids: string[]): T {
if (!projectUids.length) {
throw new SmartlingException("At least one project uid is required.");
}

if (projectUids.length > MAX_PROJECT_UIDS_SIZE) {
throw new SmartlingException(`The request contains too many project uids: ${projectUids.length}. Maximum allowed project uids number is ${MAX_PROJECT_UIDS_SIZE}.`);
}
this.set("projectUids", projectUids);

return this as unknown as T;
}
}
11 changes: 11 additions & 0 deletions api/webhooks/params/get-subscription-events-parameters.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import { BaseParameters } from "../../parameters";

export class GetSubscriptionEventsParameters extends BaseParameters {
setLimit(limit: number): GetSubscriptionEventsParameters {
if (limit > 0) {
this.set("limit", limit);
}

return this;
}
}
6 changes: 6 additions & 0 deletions api/webhooks/params/subscription-event.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
interface SubscriptionEvent {
type: string;
schemaVersion: string;
}

export { SubscriptionEvent };
6 changes: 6 additions & 0 deletions api/webhooks/params/subscription-request-header.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
interface SubscriptionRequestHeader {
headerName: string;
headerValue: string;
}

export { SubscriptionRequestHeader };
20 changes: 20 additions & 0 deletions api/webhooks/params/update-subscription-parameters.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { CreateUpdateSubscriptionParameters } from "./create-update-subscription-parameters";
import { SubscriptionEvent } from "./subscription-event";

export class UpdateSubscriptionParameters
extends CreateUpdateSubscriptionParameters<UpdateSubscriptionParameters> {
constructor(
subscriptionName: string,
subscriptionUrl: string,
events: SubscriptionEvent[],
enabled: boolean
) {
super(
subscriptionName,
subscriptionUrl,
events
);

this.set("enabled", !!enabled);
}
}
14 changes: 14 additions & 0 deletions api/webhooks/params/update-subscription-secret-parameters.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { BaseParameters } from "../../parameters";
import { SmartlingException } from "../../exception";

export class UpdateSubscriptionSecretParameters extends BaseParameters {
constructor(payloadSecret: string) {
super();

if (!payloadSecret) {
throw new SmartlingException("Payload secret is required.");
}

this.set("payloadSecret", payloadSecret);
}
}
142 changes: 142 additions & 0 deletions api/webhooks/smartling-webhooks-api.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,142 @@
import { SmartlingBaseApi } from "../base";
import { SmartlingAuthApi } from "../auth";
import { Logger } from "../logger";
import { SmartlingListResponse } from "../http/smartling-list-response";
import { SubscriptionDto } from "./dto/subscription-dto";
import { SubscriptionSecretDto } from "./dto/subscription-secret-dto";
import { SubscriptionStatisticsDto } from "./dto/subscription-statistics-dto";
import { CreateSubscriptionParameters } from "./params/create-subscription-parameters";
import { UpdateSubscriptionParameters } from "./params/update-subscription-parameters";
import { UpdateSubscriptionSecretParameters } from "./params/update-subscription-secret-parameters";

export class SmartlingWebhooksApi extends SmartlingBaseApi {
constructor(smartlingApiBaseUrl: string, authApi: SmartlingAuthApi, logger: Logger) {
super(logger);
this.authApi = authApi;
this.entrypoint = `${smartlingApiBaseUrl}/webhooks-api/v2`;
}

getSubscriptions(
accountUid: string
): Promise<SmartlingListResponse<SubscriptionDto>> {
return this.makeRequest(
"get",
`${this.entrypoint}/accounts/${accountUid}/subscriptions`
);
}

getSubscription(
accountUid: string,
subscriptionUid: string
): Promise<SubscriptionDto> {
return this.makeRequest(
"get",
`${this.entrypoint}/accounts/${accountUid}/subscriptions/${subscriptionUid}`
);
}

createSubscription(
accountUid: string,
params: CreateSubscriptionParameters
): Promise<SubscriptionDto> {
return this.makeRequest(
"post",
`${this.entrypoint}/accounts/${accountUid}/subscriptions`,
JSON.stringify(params.export())
);
}

updateSubscription(
accountUid: string,
subscriptionUid: string,
params: UpdateSubscriptionParameters
): Promise<SubscriptionDto> {
return this.makeRequest(
"put",
`${this.entrypoint}/accounts/${accountUid}/subscriptions/${subscriptionUid}`,
JSON.stringify(params.export())
);
}

deleteSubscription(
accountUid: string,
subscriptionUid: string
): Promise<void> {
return this.makeRequest(
"delete",
`${this.entrypoint}/accounts/${accountUid}/subscriptions/${subscriptionUid}`
);
}

enableSubscription(
accountUid: string,
subscriptionUid: string
): Promise<void> {
return this.makeRequest(
"post",
`${this.entrypoint}/accounts/${accountUid}/subscriptions/${subscriptionUid}/enable`
);
}

disableSubscription(
accountUid: string,
subscriptionUid: string
): Promise<void> {
return this.makeRequest(
"post",
`${this.entrypoint}/accounts/${accountUid}/subscriptions/${subscriptionUid}/disable`
);
}

testSubscription(
accountUid: string,
subscriptionUid: string
): Promise<void> {
return this.makeRequest(
"post",
`${this.entrypoint}/accounts/${accountUid}/subscriptions/${subscriptionUid}/test`
);
}

getSubscriptionSecret(
accountUid: string,
subscriptionUid: string
): Promise<SubscriptionSecretDto> {
return this.makeRequest(
"get",
`${this.entrypoint}/accounts/${accountUid}/subscriptions/${subscriptionUid}/secret`
);
}

updateSubscriptionSecret(
accountUid: string,
subscriptionUid: string,
params: UpdateSubscriptionSecretParameters
): Promise<SubscriptionSecretDto> {
return this.makeRequest(
"put",
`${this.entrypoint}/accounts/${accountUid}/subscriptions/${subscriptionUid}/secret`,
JSON.stringify(params.export())
);
}

getSubscriptionStatistics(
accountUid: string,
subscriptionUid: string
): Promise<SubscriptionStatisticsDto> {
return this.makeRequest(
"get",
`${this.entrypoint}/accounts/${accountUid}/subscriptions/${subscriptionUid}/statistics`
);
}

// getSubscriptionEvents() {}

// getSubscriptionEvent() {}

// sendSubscriptionEvent() {}

// getSubscriptionEventAttempts() {}

// getAvailableEventTypes() {}
}
1 change: 1 addition & 0 deletions index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -114,3 +114,4 @@ export * from "./api/mt/index";
export * from "./api/mt/params/smartling-mt-parameters";
export * from "./api/mt/params/source-text-item";
export * from "./api/mt/dto/translation-text-item-dto";
export * from "./api/webhooks";
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

Loading