Ship the full Communication portal (real SMS API, feature-locked future channels), BFF proxy, docs, snapshot, and phase handover. Co-authored-by: Cursor <cursoragent@cursor.com>
152 lines
6.1 KiB
TypeScript
152 lines
6.1 KiB
TypeScript
import { communicationApi } from "@/modules/communication/services/communication-api";
|
|
import type { CommunicationListConfig } from "@/modules/communication/components/CommunicationListCrudPage";
|
|
|
|
export const communicationResources = {
|
|
providers: {
|
|
title: "ارائهدهندگان SMS",
|
|
description: "پیکربندی mock، Payamak و failover",
|
|
resourceKey: "providers",
|
|
permission: "communication.providers.view",
|
|
api: {
|
|
list: (tenantId: string) => communicationApi.providers.list(tenantId),
|
|
create: (tenantId: string, body: Record<string, unknown>) =>
|
|
communicationApi.providers.create(tenantId, body),
|
|
update: (tenantId: string, id: string, body: Record<string, unknown>) =>
|
|
communicationApi.providers.update(tenantId, id, body),
|
|
remove: (tenantId: string, id: string) => communicationApi.providers.remove(tenantId, id),
|
|
},
|
|
columns: [
|
|
{ key: "name", header: "نام" },
|
|
{ key: "provider_kind", header: "نوع" },
|
|
{ key: "channel", header: "کانال" },
|
|
{ key: "status", header: "وضعیت", type: "status" as const },
|
|
{ key: "priority", header: "اولویت" },
|
|
{ key: "circuit_state", header: "Circuit" },
|
|
],
|
|
createFields: [
|
|
{ name: "name", label: "نام", required: true },
|
|
{
|
|
name: "provider_kind",
|
|
label: "نوع",
|
|
type: "select" as const,
|
|
required: true,
|
|
options: [
|
|
{ value: "mock", label: "Mock" },
|
|
{ value: "payamak", label: "Payamak" },
|
|
],
|
|
},
|
|
{ name: "channel", label: "کانال", required: true, placeholder: "sms" },
|
|
{ name: "priority", label: "اولویت", type: "number" as const },
|
|
{ name: "rate_limit_per_minute", label: "Rate limit/min", type: "number" as const },
|
|
],
|
|
} satisfies CommunicationListConfig,
|
|
|
|
senders: {
|
|
title: "Sender ID",
|
|
description: "شمارههای ارسال SMS",
|
|
resourceKey: "senders",
|
|
permission: "communication.senders.view",
|
|
api: {
|
|
list: (tenantId: string) => communicationApi.providers.senders.list(tenantId),
|
|
create: (tenantId: string, body: Record<string, unknown>) =>
|
|
communicationApi.providers.senders.create(tenantId, body),
|
|
},
|
|
columns: [
|
|
{ key: "value", header: "شماره / شناسه" },
|
|
{ key: "label", header: "برچسب" },
|
|
{ key: "channel", header: "کانال" },
|
|
{ key: "is_default", header: "پیشفرض" },
|
|
{ key: "is_active", header: "فعال" },
|
|
],
|
|
createFields: [
|
|
{ name: "channel", label: "کانال", required: true, placeholder: "sms" },
|
|
{ name: "value", label: "مقدار", required: true },
|
|
{ name: "label", label: "برچسب" },
|
|
],
|
|
readOnly: false,
|
|
} satisfies CommunicationListConfig,
|
|
|
|
templates: {
|
|
title: "قالبهای پیام",
|
|
resourceKey: "templates",
|
|
permission: "communication.templates.view",
|
|
api: {
|
|
list: (tenantId: string) => communicationApi.templates.list(tenantId),
|
|
create: (tenantId: string, body: Record<string, unknown>) =>
|
|
communicationApi.templates.create(tenantId, body),
|
|
},
|
|
columns: [
|
|
{ key: "template_key", header: "کلید" },
|
|
{ key: "name", header: "نام" },
|
|
{ key: "channel", header: "کانال" },
|
|
{ key: "locale", header: "زبان" },
|
|
{ key: "status", header: "وضعیت", type: "status" as const },
|
|
{ key: "version", header: "نسخه" },
|
|
],
|
|
createFields: [
|
|
{ name: "template_key", label: "کلید قالب", required: true },
|
|
{ name: "name", label: "نام", required: true },
|
|
{ name: "channel", label: "کانال", required: true, placeholder: "sms" },
|
|
{ name: "locale", label: "زبان", placeholder: "fa" },
|
|
{ name: "body", label: "متن", type: "textarea" as const, required: true },
|
|
],
|
|
} satisfies CommunicationListConfig,
|
|
|
|
recipients: {
|
|
title: "گیرندگان",
|
|
resourceKey: "recipients",
|
|
permission: "communication.contacts.view",
|
|
api: {
|
|
list: (tenantId: string) => communicationApi.contacts.manual.list(tenantId),
|
|
create: (tenantId: string, body: Record<string, unknown>) =>
|
|
communicationApi.contacts.manual.create(tenantId, body),
|
|
},
|
|
columns: [
|
|
{ key: "display_name", header: "نام" },
|
|
{ key: "phone", header: "موبایل" },
|
|
{ key: "email", header: "ایمیل" },
|
|
{ key: "created_at", header: "ایجاد", type: "datetime" as const },
|
|
],
|
|
createFields: [
|
|
{ name: "display_name", label: "نام نمایشی" },
|
|
{ name: "phone", label: "موبایل", required: true },
|
|
{ name: "email", label: "ایمیل", type: "email" as const },
|
|
],
|
|
} satisfies CommunicationListConfig,
|
|
|
|
contactSources: {
|
|
title: "منابع پویای مخاطب",
|
|
resourceKey: "contactSources",
|
|
permission: "communication.sources.view",
|
|
api: {
|
|
list: (tenantId: string) => communicationApi.contacts.sources.list(tenantId),
|
|
create: (tenantId: string, body: Record<string, unknown>) =>
|
|
communicationApi.contacts.sources.create(tenantId, body),
|
|
},
|
|
columns: [
|
|
{ key: "name", header: "نام" },
|
|
{ key: "source_type", header: "نوع" },
|
|
{ key: "base_url", header: "URL پایه" },
|
|
{ key: "is_active", header: "فعال" },
|
|
],
|
|
createFields: [
|
|
{ name: "name", label: "نام", required: true },
|
|
{
|
|
name: "source_type",
|
|
label: "نوع منبع",
|
|
type: "select" as const,
|
|
required: true,
|
|
options: [
|
|
{ value: "crm", label: "CRM" },
|
|
{ value: "loyalty", label: "Loyalty" },
|
|
{ value: "sports", label: "Sports" },
|
|
{ value: "restaurant", label: "Restaurant" },
|
|
{ value: "external_rest", label: "REST خارجی" },
|
|
],
|
|
},
|
|
{ name: "base_url", label: "URL پایه" },
|
|
{ name: "endpoint_path", label: "مسیر endpoint" },
|
|
],
|
|
} satisfies CommunicationListConfig,
|
|
};
|