Service Design Specification
Notification Service Documentation
Version:
1.0
Scope
This document provides a comprehensive architectural overview of the Notification Service, which is responsible for sending multi-channel notifications via Email, SMS, and Push. The service supports both REST and gRPC interfaces and utilizes an event-driven architecture through Kafka.
This document is intended for:
- Backend Developers integrating notification capabilities.
- DevOps Engineers deploying or monitoring the notification system.
- Architects evaluating extensibility, observability, and scalability.
For detailed REST interface, refer to the [REST API Guide]. For Kafka-based publishing and consumption flows, refer to the [Event API Guide].
Service Settings
-
Port: Configurable via
HTTP_PORT, default:3000 -
Primary Interfaces:
- REST over Express
- gRPC over Proto3
- Kafka via event topics
-
Database: PostgreSQL (via Sequelize)
-
Optional: Redis (for caching or state sharing)
-
Email/SMS/Push Provider Configuration: Dynamically switchable via
.env
Interfaces Overview
REST API
Exposes endpoints to:
- Register/unregister devices
- Fetch user notifications
- Send new notifications
- Mark notifications as seen
For full list and parameters, refer to the REST API Guide.
gRPC API
Defined via
notification.sender.proto:
-
SendNotice()RPC triggers notification dispatch for all specified channels. - Used for inter-service communication where synchronous flow is preferred.
Kafka Events
-
The service publishes to and subscribes from:
-
<codename>-notification-email -
<codename>-notification-push -
<codename>-notification-sms
-
For event structure and consumption logic, refer to the Event API Guide.
Provider Architecture
Each channel (SMS, Email, Push) is pluggable using a provider pattern. Providers can be toggled via env vars.
Email Providers
- SendGrid
- SMTP
- AmazonSES
- FakeProvider (for dev/test)
Push Providers
- Firebase (FCM)
- OneSignal
- AmazonSNS
- FakeProvider
SMS Providers
- Twilio
- AmazonSNS
- NetGSM
- Vonage
- FakeProvider
Each provider implements a common
send(payload)
method and logs delivery result.
Storage Mode
Notifications can be optionally stored in the PostgreSQL database
if
STORED_NOTICE=true
and
notificationBody.isStored=true.
Stored data includes:
-
userId,title,body -
metadata(JSON) -
isSeenflag -
createdAt/updatedAttimestamps
Aggregation & Templating
Notification body and title can be:
-
Directly passed as raw strings
-
Or dynamically populated via predefined templates:
-
WELCOME -
OTP -
RESETPASSWORD -
NONE(no template)
-
Template rendering supports interpolation with
metadata. Separate template files exist for:
- Email (HTML)
- SMS (Text)
- Push (structured JSON)
Middleware
Error Handling
-
ApiErrorused for standard error shaping -
errorConverter,errorHandlerused globally
Validation
-
All routes use Joi schema validation
-
Validations available for:
- Device registration
- Notification send
- Pagination and sort filters
- Mark-as-seen by IDs
Utilities
-
pick(): Selects allowed keys from request -
pagination(): Sequelize-based paginated query utility
Lifecycle & Boot Process
-
Loads configuration from
.envusingdotenv -
Initializes:
- Express HTTP Server
-
gRPC Server (if
GRPC_ACTIVE=true) - Kafka listeners
- Redis connection
- PostgreSQL connection
-
Injects OpenAPI/Swagger via
api-face -
Registers REST routes and middleware
-
Launches any scheduled cron jobs
-
Handles graceful shutdown via
SIGINT
Environment Variables
| Variable | Description |
|---|---|
HTTP_PORT
|
Express HTTP port (default: 3000) |
GRPC_PORT
|
gRPC server port (default: 50051) |
SERVICE_URL
|
Used to build auth redirect paths |
SERVICE_SHORT_NAME
|
Used for auth hostname substitution |
PG_USER,
PG_PASS
|
PostgreSQL credentials |
REDIS_HOST
|
Redis connection string |
STORED_NOTICE
|
Whether to persist notifications |
SENDGRID_API_KEY
|
SendGrid API token |
SMTP_USER/PASS/PORT
|
SMTP credentials |
TWILIO_*,
NETGSM_*
|
SMS provider credentials |
ONESIGNAL_API_KEY
|
OneSignal Push key |
Testing Strategy
Unit Tests
-
Provider
.send()methods - Templating with metadata
- Validation schema boundaries
Integration Tests
- REST endpoint workflows
- Kafka → Listener execution
- gRPC request handling
End-to-End (Optional)
- Simulate a full pipeline: Send → Store → Fetch → Mark as Seen
Observability & Logging
- Each send call logs payload & result to console
- Provider-specific errors include stack traces