mnotify-ts-sdk
Version:
Modern, zero-dependency TypeScript SDK for mNotify BMS API - Type-safe SMS, contacts, and account management with Railway-Oriented Programming
396 lines • 14.7 kB
JavaScript
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.GroupService = void 0;
const validation_1 = require("../utils/validation");
const Result_1 = require("../types/Result");
const MNotifyError_1 = require("../errors/MNotifyError");
const errorContext_1 = require("../errors/errorContext");
/**
* Validates group response
*/
const validateGroup = (data) => {
if (!(0, validation_1.isObject)(data))
return false;
const id = ((0, validation_1.isString)(data.id) && data.id) || ((0, validation_1.isString)(data._id) && data._id) || null;
const name = ((0, validation_1.isString)(data.name) && data.name) ||
((0, validation_1.isString)(data.group_name) && data.group_name) ||
null;
return Boolean(id && name);
};
const normalizeGroup = (data) => {
if (!(0, validation_1.isObject)(data))
return null;
const id = ((0, validation_1.isString)(data.id) && data.id) || ((0, validation_1.isString)(data._id) && data._id) || null;
const name = ((0, validation_1.isString)(data.name) && data.name) ||
((0, validation_1.isString)(data.group_name) && data.group_name) ||
null;
if (!id || !name) {
return null;
}
return {
id,
name,
description: (0, validation_1.isString)(data.description) ? data.description : undefined,
contact_count: (0, validation_1.isNumber)(data.contact_count) ? data.contact_count : 0,
created_at: (0, validation_1.isString)(data.created_at) ? data.created_at : "",
updated_at: (0, validation_1.isString)(data.updated_at) ? data.updated_at : "",
};
};
/**
* Service for managing contact groups with mNotify API
*/
class GroupService {
constructor(client) {
this.client = client;
}
annotate(result, operation) {
return (0, errorContext_1.annotateResultError)(result, {
service: "GroupService",
operation,
});
}
/**
* Creates a new contact group (railway-oriented programming)
* @param input - Group data
* @returns Result containing created group or error
*
* @example
* ```typescript
* const result = await groupService.createGroupSafe({
* name: 'VIP Customers',
* description: 'High-value customer segment'
* });
* result.match({
* ok: (group) => console.log('Group created:', group),
* err: (error) => console.error('Failed to create group:', error)
* });
* ```
*/
createGroupSafe(input) {
return __awaiter(this, void 0, void 0, function* () {
const result = this.annotate(yield this.client.requestSafe({
method: "POST",
url: "/group",
data: {
group_name: input.name,
description: input.description,
},
}), "createGroupSafe");
if (result.isErr()) {
return result;
}
if (!validateGroup(result.value)) {
return (0, Result_1.err)(new MNotifyError_1.MNotifyError("Invalid group response format", 0, result.value, {
service: "GroupService",
operation: "createGroupSafe",
stage: "validation",
}));
}
const normalized = normalizeGroup(result.value);
if (!normalized) {
return (0, Result_1.err)(new MNotifyError_1.MNotifyError("Invalid group response format", 0, result.value, {
service: "GroupService",
operation: "createGroupSafe",
stage: "validation",
}));
}
return (0, Result_1.ok)(normalized);
});
}
/**
* Creates a new contact group (throws on error - legacy API)
* @param input - Group data
* @returns Created group
* @throws {MNotifyError} On API failure
*
* @example
* ```typescript
* const group = await groupService.createGroup({
* name: 'VIP Customers',
* description: 'High-value customer segment'
* });
* ```
*/
createGroup(input) {
return __awaiter(this, void 0, void 0, function* () {
const result = yield this.createGroupSafe(input);
return result.unwrap();
});
}
/**
* Retrieves all groups (railway-oriented programming)
* @returns Result containing array of groups or error
*
* @example
* ```typescript
* const result = await groupService.getGroupsSafe();
* if (result.isOk()) {
* console.log('Groups:', result.value);
* }
* ```
*/
getGroupsSafe() {
return __awaiter(this, void 0, void 0, function* () {
const result = this.annotate(yield this.client.requestSafe({
method: "GET",
url: "/group",
}), "getGroupsSafe");
if (result.isErr()) {
return result;
}
if (!(0, validation_1.isArray)(result.value)) {
return (0, Result_1.err)(new MNotifyError_1.MNotifyError("Invalid groups response format", 0, result.value, {
service: "GroupService",
operation: "getGroupsSafe",
stage: "validation",
}));
}
const normalized = result.value
.map((item) => normalizeGroup(item))
.filter((item) => item !== null);
return (0, Result_1.ok)(normalized);
});
}
/**
* Retrieves all groups (throws on error - legacy API)
* @returns Array of groups
* @throws {MNotifyError} On API failure
*
* @example
* ```typescript
* const groups = await groupService.getGroups();
* console.log('Groups:', groups);
* ```
*/
getGroups() {
return __awaiter(this, void 0, void 0, function* () {
const result = yield this.getGroupsSafe();
return result.unwrap();
});
}
/**
* Retrieves a specific group by ID (railway-oriented programming)
* @param id - Group ID
* @returns Result containing group details or error
*
* @example
* ```typescript
* const result = await groupService.getGroupSafe('group_123');
* result.match({
* ok: (group) => console.log('Group:', group),
* err: (error) => console.error('Failed to get group:', error)
* });
* ```
*/
getGroupSafe(id) {
return __awaiter(this, void 0, void 0, function* () {
const result = this.annotate(yield this.client.requestSafe({
method: "GET",
url: `/group/${id}`,
}), "getGroupSafe");
if (result.isErr()) {
return result;
}
if (!validateGroup(result.value)) {
return (0, Result_1.err)(new MNotifyError_1.MNotifyError("Invalid group response format", 0, result.value, {
service: "GroupService",
operation: "getGroupSafe",
stage: "validation",
}));
}
const normalized = normalizeGroup(result.value);
if (!normalized) {
return (0, Result_1.err)(new MNotifyError_1.MNotifyError("Invalid group response format", 0, result.value, {
service: "GroupService",
operation: "getGroupSafe",
stage: "validation",
}));
}
return (0, Result_1.ok)(normalized);
});
}
/**
* Retrieves a specific group by ID (throws on error - legacy API)
* @param id - Group ID
* @returns Group details
* @throws {MNotifyError} On API failure
*
* @example
* ```typescript
* const group = await groupService.getGroup('group_123');
* console.log('Group:', group);
* ```
*/
getGroup(id) {
return __awaiter(this, void 0, void 0, function* () {
const result = yield this.getGroupSafe(id);
return result.unwrap();
});
}
/**
* Adds a contact to a group (railway-oriented programming)
* @param groupId - Group ID
* @param contactId - Contact ID
* @returns Result containing operation result or error
*
* @example
* ```typescript
* const result = await groupService.addContactToGroupSafe('group_123', 'contact_456');
* result.match({
* ok: (res) => console.log('Contact added:', res),
* err: (error) => console.error('Failed to add contact:', error)
* });
* ```
*/
addContactToGroupSafe(groupId, contactId) {
return __awaiter(this, void 0, void 0, function* () {
const result = this.annotate(yield this.client.requestSafe({
method: "POST",
url: `/contact/${groupId}`,
data: { contact_id: contactId },
}), "addContactToGroupSafe");
if (result.isErr()) {
return result;
}
if (!(0, validation_1.isObject)(result.value)) {
return (0, Result_1.err)(new MNotifyError_1.MNotifyError("Invalid add contact response format", 0, result.value, {
service: "GroupService",
operation: "addContactToGroupSafe",
stage: "validation",
}));
}
return (0, Result_1.ok)(result.value);
});
}
/**
* Adds a contact to a group (throws on error - legacy API)
* @param groupId - Group ID
* @param contactId - Contact ID
* @returns Operation result
* @throws {MNotifyError} On API failure
*
* @example
* ```typescript
* await groupService.addContactToGroup('group_123', 'contact_456');
* ```
*/
addContactToGroup(groupId, contactId) {
return __awaiter(this, void 0, void 0, function* () {
const result = yield this.addContactToGroupSafe(groupId, contactId);
return result.unwrap();
});
}
/**
* Removes a contact from a group (railway-oriented programming)
* @param groupId - Group ID
* @param contactId - Contact ID
* @returns Result containing operation result or error
*
* @example
* ```typescript
* const result = await groupService.removeContactFromGroupSafe('group_123', 'contact_456');
* result.match({
* ok: (res) => console.log('Contact removed:', res),
* err: (error) => console.error('Failed to remove contact:', error)
* });
* ```
*/
removeContactFromGroupSafe(groupId, contactId) {
return __awaiter(this, void 0, void 0, function* () {
const result = this.annotate(yield this.client.requestSafe({
method: "DELETE",
url: `/contact/${contactId}/${groupId}`,
}), "removeContactFromGroupSafe");
if (result.isErr()) {
return result;
}
if (!(0, validation_1.isObject)(result.value)) {
return (0, Result_1.err)(new MNotifyError_1.MNotifyError("Invalid remove contact response format", 0, result.value, {
service: "GroupService",
operation: "removeContactFromGroupSafe",
stage: "validation",
}));
}
return (0, Result_1.ok)(result.value);
});
}
/**
* Removes a contact from a group (throws on error - legacy API)
* @param groupId - Group ID
* @param contactId - Contact ID
* @returns Operation result
* @throws {MNotifyError} On API failure
*
* @example
* ```typescript
* await groupService.removeContactFromGroup('group_123', 'contact_456');
* ```
*/
removeContactFromGroup(groupId, contactId) {
return __awaiter(this, void 0, void 0, function* () {
const result = yield this.removeContactFromGroupSafe(groupId, contactId);
return result.unwrap();
});
}
/**
* Deletes a group (railway-oriented programming)
* @param id - Group ID
* @returns Result containing deletion confirmation or error
*
* @example
* ```typescript
* const result = await groupService.deleteGroupSafe('group_123');
* result.match({
* ok: (res) => console.log('Group deleted:', res),
* err: (error) => console.error('Failed to delete group:', error)
* });
* ```
*/
deleteGroupSafe(id) {
return __awaiter(this, void 0, void 0, function* () {
const result = this.annotate(yield this.client.requestSafe({
method: "DELETE",
url: `/group/${id}`,
}), "deleteGroupSafe");
if (result.isErr()) {
return result;
}
if (!(0, validation_1.isObject)(result.value)) {
return (0, Result_1.err)(new MNotifyError_1.MNotifyError("Invalid delete response format", 0, result.value, {
service: "GroupService",
operation: "deleteGroupSafe",
stage: "validation",
}));
}
return (0, Result_1.ok)(result.value);
});
}
/**
* Deletes a group (throws on error - legacy API)
* @param id - Group ID
* @returns Deletion confirmation
* @throws {MNotifyError} On API failure
*
* @example
* ```typescript
* await groupService.deleteGroup('group_123');
* ```
*/
deleteGroup(id) {
return __awaiter(this, void 0, void 0, function* () {
const result = yield this.deleteGroupSafe(id);
return result.unwrap();
});
}
}
exports.GroupService = GroupService;
//# sourceMappingURL=GroupService.js.map