@hunglv09/shared-message
v1.0.0
Published
Shared utilities for Ecash microservices - Message handling, i18n, error helpers
Downloads
14
Maintainers
Readme
@ecash/shared
Shared utilities for Ecash microservices - Message handling, i18n, error helpers.
Features
- i18n Message System: Get localized messages from database with caching
- Parameter Replacement: Dynamic message templates with
{placeholder}support - Language Detection: Auto-detect language from request headers or query params
- Error Helpers: Throw errors with dynamic, localized messages
Installation
npm install @ecash/sharedSetup
1. Prepare Database Messages
Create messages in your messages collection:
{
"code": "ECASH_00001",
"classificationCode": "ECASH",
"content": {
"vi": "Metadata không hợp lệ theo schema của project type '{projectTypeCode}': {errors}",
"en": "Metadata is invalid according to project type '{projectTypeCode}' schema: {errors}",
"ko": "프로젝트 유형 '{projectTypeCode}'의 스키마에 따라 메타데이터가 유효하지 않습니다: {errors}"
}
}2. Implement MessageServicePort
Each microservice implements the message service:
// ecash-marketplace/src/application/services/message/get-message-content.service.ts
import { MessageServicePort } from "@ecash/shared";
export class GetMessageContentService implements MessageServicePort {
async getMessageContentByCode(code: string, language: string) {
// Your implementation - query DB/Redis
const cached = await redis.get(`message:${code}:${language}`);
if (cached) return JSON.parse(cached);
const message = await db.collection("messages").findOne({ code });
return {
code: message.code,
classificationCode: message.classificationCode,
message: message.content[language],
};
}
}Usage
1. Get Language from Request
import { getLanguageFromRequest } from "@ecash/shared";
const language = getLanguageFromRequest(request); // "vi", "en", "ko"2. Get Localized Message
import { getMessage } from "@ecash/shared";
const message = await getMessage(messageService, "ECASH_00001", "vi", {
projectTypeCode: "APARTMENT",
errors: "field required",
});
// Returns: "Metadata không hợp lệ theo schema của project type 'APARTMENT': field required"3. Get Message from Request (Shorthand)
import { getMessageFromRequest } from "@ecash/shared";
const message = await getMessageFromRequest(
request,
messageService,
"ECASH_00001",
{ projectTypeCode: "APARTMENT" },
);4. Throw Message Error
import { throwMessageError } from "@ecash/shared";
await throwMessageError(
messageService,
"vi",
"ECASH_00001",
{ projectTypeCode: "APARTMENT", errors: "field required" },
"COMM0400",
);5. Create Message Error (without throwing)
import { createMessageError } from "@ecash/shared";
const error = await createMessageError(messageService, "vi", {
messageCode: "ECASH_00001",
responseCode: "COMM0400",
params: { projectTypeCode: "APARTMENT" },
});
throw error;API Reference
getLanguageFromRequest(request, defaultLang?)
Extract language from request headers or query params.
- Priority:
Accept-Languageheader >?lang=query >defaultLang - Returns: Language code (
"vi","en","ko")
getMessage(messageService, code, language, params?)
Get localized message with parameter replacement.
- messageService: Service implementing
MessageServicePort - code: Message code from database
- language: Target language
- params: Object with key-value pairs to replace
{key}in template
getMessageFromRequest(request, messageService, code, params?)
Shorthand that extracts language from request and gets message.
throwMessageError(messageService, language, messageCode, params?, responseCode?, statusCode?)
Throw error with localized message from database.
createMessageError(messageService, language, options)
Create MessageError object without throwing.
Language Detection
The library detects language in this order:
- Header:
Accept-Language: vi-VN, vi;q=0.9→"vi" - Query:
?lang=en→"en" - Default:
"vi"
Message Template Syntax
Use {key} placeholders in your message templates:
{
"content": {
"vi": "Xin chào {name}, bạn có {count} tin nhắn mới",
"en": "Hello {name}, you have {count} new messages"
}
}getMessage(messageService, "MSG_00001", "vi", { name: "John", count: 5 });
// "Xin chào John, bạn có 5 tin nhắn mới"Publishing
cd ecash-shared
npm run build
npm publishLicense
PRIVATE - Ecash internal use only.