Survey Service
Overview
Surveys are an important way to close the feedback loop on the services that are delivered by ULBs. Without proper surveys ULB employees will never know how happy the citizens are, about the services they consume and what the areas of improvement are.
Surveys section will be used by ULB employees to create citizen surveys to make better informed decisions while issuing new policies/ feedback on existing services.
Pre-requisites
Prior Knowledge of Java/J2EE.
Prior Knowledge of SpringBoot.
Prior Knowledge of PostgresSQL.
Prior Knowledge of REST APIs and related concepts like path parameters, headers, JSON etc.
Prior Knowledge of JSONQuery in Postgres. (Similar to PostgresSQL with a few aggregate functions.)
Key Functionalities and Configurations
This service allows -
Employees - to create, edit, delete surveys
Employees - to share survey results with other employees/citizens
Citizens - to fill surveys
Each survey entity will have questions associated with it. Questions can be of -
short answer type
2. long answer type
3. multiple answers type
4. checkbox answer type
5. date answer type
6. time answer type
Survey entities will have a collectCitizenInfo flag associated with them, if that flag is set to true, mobile number and email address of the citizens responding to the survey will be captured. If it is set to false, responding to the survey will be completely anonymous.
Surveys will have a startDate and endDate associated with them. Within that period, those surveys will be shown in the active section. However, in case the survey has been manually marked inactive by the employee during its active period, that survey will be shown under the inactive surveys section. Citizens can look at active survey entities and submit their responses for that survey.
Once a survey is created, it can be searched with the following parameters -
tenantIds - To search surveys based on multiple ulbs
title - To search surveys based on survey names
postedBy - To search surveys based on employee who created the survey
status - To search surveys based on status
Also, if any created survey needs to be updated -
Before the survey becomes active, users can edit all the fields.
While Editing, We can add , delete, modify Questions.
Once the survey becomes Live user can only change
a. Survey Description
b.End date and time of the survey
In case of deletion of a survey, the survey will be soft deleted i.e. the ‘active’ boolean field will be set to false and it will not appear in search results.
NOTE:
1.In search of survey we display only questions which are in active status
2. While editing , if a question of a survey is deleted , then we mark the question as inactive in db
Swagger Documentation
Link to the swagger documentation can be found below -
API Details
APIs for interacting with survey service can be found in this collection
Survey persister
serviceMaps:
serviceName: egov-survey-services
mappings:
- version: 1.0
description: Persists surveys in eg_ss_survey table
fromTopic: save-ss-survey
isTransaction: true
queryMaps:
- query: INSERT INTO eg_ss_survey( uuid,tenantid,title,description,status,postedby,startDate,endDate,collectCitizenInfo,active,createdby,lastmodifiedby,createdtime,lastmodifiedtime) VALUES (?,?,?,?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);
basePath: SurveyEntity
jsonMaps:
- jsonPath: $.SurveyEntity.uuid
- jsonPath: $.SurveyEntity.tenantId
- jsonPath: $.SurveyEntity.title
- jsonPath: $.SurveyEntity.description
- jsonPath: $.SurveyEntity.status
- jsonPath: $.SurveyEntity.postedBy
- jsonPath: $.SurveyEntity.startDate
- jsonPath: $.SurveyEntity.endDate
- jsonPath: $.SurveyEntity.collectCitizenInfo
- jsonPath: $.SurveyEntity.active
- jsonPath: $.SurveyEntity.auditDetails.createdBy
- jsonPath: $.SurveyEntity.auditDetails.lastModifiedBy
- jsonPath: $.SurveyEntity.auditDetails.createdTime
- jsonPath: $.SurveyEntity.auditDetails.lastModifiedTime
- query: INSERT INTO eg_ss_question( uuid,surveyid,questionstatement,options,status,type,required,createdby,lastmodifiedby,createdtime,lastmodifiedtime,qorder) VALUES (?,?,?,?,?,?,?,?,?,?,?,?);
basePath: SurveyEntity.questions.*
jsonMaps:
- jsonPath: $.SurveyEntity.questions.*.uuid
- jsonPath: $.SurveyEntity.questions.*.surveyId
- jsonPath: $.SurveyEntity.questions.*.questionStatement
- jsonPath: $.SurveyEntity.questions.*.options
type: ARRAY
dbType: STRING
- jsonPath: $.SurveyEntity.questions.*.status
- jsonPath: $.SurveyEntity.questions.*.type
- jsonPath: $.SurveyEntity.questions.*.required
- jsonPath: $.SurveyEntity.questions.*.auditDetails.createdBy
- jsonPath: $.SurveyEntity.questions.*.auditDetails.lastModifiedBy
- jsonPath: $.SurveyEntity.questions.*.auditDetails.createdTime
- jsonPath: $.SurveyEntity.questions.*.auditDetails.lastModifiedTime
- jsonPath: $.SurveyEntity.questions.*.qorder
- version: 1.0
description: Persists answers in eg_ss_answer table
fromTopic: save-ss-answer
isTransaction: true
queryMaps:
- query: INSERT INTO eg_ss_answer( uuid,questionid,surveyid,answer,citizenid,mobilenumber,emailid,createdby,lastmodifiedby,createdtime,lastmodifiedtime) VALUES (?,?,?,?,?,?,?,?,?,?,?);
basePath: AnswerEntity.answers.*
jsonMaps:
- jsonPath: $.AnswerEntity.answers.*.uuid
- jsonPath: $.AnswerEntity.answers.*.questionId
- jsonPath: $.AnswerEntity.surveyId
- jsonPath: $.AnswerEntity.answers.*.answer
type: ARRAY
dbType: STRING
- jsonPath: $.AnswerEntity.answers.*.citizenId
- jsonPath: $.AnswerEntity.answers.*.mobileNumber
- jsonPath: $.AnswerEntity.answers.*.emailId
- jsonPath: $.AnswerEntity.answers.*.auditDetails.createdBy
- jsonPath: $.AnswerEntity.answers.*.auditDetails.lastModifiedBy
- jsonPath: $.AnswerEntity.answers.*.auditDetails.createdTime
- jsonPath: $.AnswerEntity.answers.*.auditDetails.lastModifiedTime
- version: 1.0
description: Updates survey in tables
fromTopic: update-ss-survey
isTransaction: true
queryMaps:
- query: UPDATE eg_ss_survey SET tenantid=?, title=?, description=?, status=?, postedBy=?, startDate = ?, endDate = ?, collectCitizenInfo = ?, lastmodifiedby=?, lastmodifiedtime=? WHERE uuid=?;
basePath: SurveyEntity
jsonMaps:
- jsonPath: $.SurveyEntity.tenantId
- jsonPath: $.SurveyEntity.title
- jsonPath: $.SurveyEntity.description
- jsonPath: $.SurveyEntity.status
- jsonPath: $.SurveyEntity.postedBy
- jsonPath: $.SurveyEntity.startDate
- jsonPath: $.SurveyEntity.endDate
- jsonPath: $.SurveyEntity.collectCitizenInfo
- jsonPath: $.SurveyEntity.auditDetails.lastModifiedBy
- jsonPath: $.SurveyEntity.auditDetails.lastModifiedTime
- jsonPath: $.SurveyEntity.uuid
- query: UPDATE eg_ss_question SET questionstatement = ?, options = ?, status = ?, type = ?, required = ?, lastmodifiedby = ?, lastmodifiedtime = ? WHERE uuid = ?;
basePath: SurveyEntity.questions.*
jsonMaps:
- jsonPath: $.SurveyEntity.questions.*.questionStatement
- jsonPath: $.SurveyEntity.questions.*.options
type: ARRAY
dbType: STRING
- jsonPath: $.SurveyEntity.questions.*.status
- jsonPath: $.SurveyEntity.questions.*.type
- jsonPath: $.SurveyEntity.questions.*.required
- jsonPath: $.SurveyEntity.questions.*.auditDetails.lastModifiedBy
- jsonPath: $.SurveyEntity.questions.*.auditDetails.lastModifiedTime
- jsonPath: $.SurveyEntity.questions.*.uuid
- query: INSERT INTO eg_ss_question( uuid,surveyid,questionstatement,options,status,type,required,createdby,lastmodifiedby,createdtime,lastmodifiedtime,qorder) VALUES (?,?,?,?,?,?,?,?,?,?,?,?);
basePath: SurveyEntity.insertQuestionsForUpdate.*
jsonMaps:
- jsonPath: $.SurveyEntity.insertQuestionsForUpdate.*.uuid
- jsonPath: $.SurveyEntity.insertQuestionsForUpdate.*.surveyId
- jsonPath: $.SurveyEntity.insertQuestionsForUpdate.*.questionStatement
- jsonPath: $.SurveyEntity.insertQuestionsForUpdate.*.options
type: ARRAY
dbType: STRING
- jsonPath: $.SurveyEntity.insertQuestionsForUpdate.*.status