SurveyJS
This integration provides a full integration with SurveyJS, a powerful JavaScript library for creating dynamic forms and surveys. Unlike other integrations located in packages/integrations, SurveyJS is implemented as a separate module that can be added to the API Harmonization server.
Requirements
To use it, you must install it into the API Harmonization server by running:
npm install @o2s/modules.surveyjs --workspace=@o2s/api --workspace=@o2s/frontend
This module provides both server-side and client-side components:
- Server-side: Handles form data fetching, processing, and submission
 - Client-side: Provides React components for rendering and interacting with forms
 
Module Structure
The SurveyJS module is structured into three main parts:
- 
API Harmonization: Server-side integration that provides:
- Controllers for handling HTTP requests
 - Services for business logic
 - Data models and mappers
 - Form submission and validation
 
 - 
Frontend: Client-side integration that provides:
- React components for rendering surveys
 - Form elements and question types
 - Submission handling
 
 - 
SDK: Software development kit that provides:
- Helper functions for working with SurveyJS
 - Integration utilities
 
 
Features
The SurveyJS module provides:
- Dynamic form creation based on JSON schemas
 - Form validation
 - Conditional logic for questions
 - Multi-page surveys
 - Various question types (text, multiple choice, rating, etc.)
 - Form submission handling
 - Integration with the ticket system
 
Usage
API Harmonization server
The API Harmonization part of the SurveyJS module provides a comprehensive backend service for managing surveys and handling form submissions.
import { SurveyJSModule } from '@o2s/modules.surveyjs/api-harmonization';
@Module({
  imports: [
    SurveyJSModule
  ],
})
export class AppModule {}
The service provides a method to retrieve surveys by their code:
// Get a survey by its code
surveyjsService.getSurvey({ code: 'contact-form' })
This method:
- Retrieves the survey metadata from the CMS
 - Fetches the survey schema from the SurveyJS service
 - Maps the response to a standardized format
 
The form submission process is handled by the submitSurvey method, which provides:
- 
Authentication and Authorization:
- Validates user access based on JWT tokens
 - Checks if the user has the required roles to submit the form
 
 - 
Validation:
- Validates the submitted data against the survey schema
 - Ensures all required fields are filled and constraints are met
 
 - 
Flexible Submission Destinations:
- Supports multiple submission destinations configured per survey
 - Currently supports submission to SurveyJS backend, but other targets can be easily added
 - Extensible for additional destinations (e.g., email, database, third-party services)
 
 - 
Error Handling:
- Provides detailed error messages for validation failures
 - Logs submission errors for troubleshooting
 
 
// Submit a survey
surveyjsService.submitSurvey({
  code: 'contact-form',
  surveyPayload: {
    name: 'John Doe',
    email: 'john@example.com',
    message: 'Hello, world!'
  }
}, 'Bearer token123');
The submission process follows these steps:
- Retrieve the survey configuration from the CMS
 - Check user authorization based on required roles
 - Validate the submitted data against the survey schema
 - Process the submission to configured destinations
 - Return success or detailed error information
 
Frontend App
import { Survey } from '@o2s/modules.surveyjs/frontend';
import { useGlobalContext } from '@o2s/ui/providers/GlobalProvider';
function MyComponent() {
  const { labels } = useGlobalContext();
  return (
    <Survey
      code="contact-form"
      labels={labels}
      locale="en"
      accessToken="optional-access-token"
    />
  );
}
The Survey component requires the following props:
- code (string, required): The identifier for the survey to be displayed
 - labels (object, required): Labels for error messages, typically obtained from the global context
 - locale (string, required): The language/locale setting (e.g., "en", "de")
 - accessToken (string, optional): Authentication token for API access if required