UNPKG

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
"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