• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

opengovsg / FormSG / 13804819569

12 Mar 2025 06:20AM UTC coverage: 72.475% (+0.2%) from 72.311%
13804819569

push

github

Kevin Foong
feat: remove active and hover styles for send reminder button

2843 of 4768 branches covered (59.63%)

Branch coverage included in aggregate %.

10201 of 13230 relevant lines covered (77.11%)

46.89 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

97.27
/src/app/modules/core/core.errors.ts
1
import { setErrorCode } from '../datadog/datadog.utils'
242✔
2

3
/**
4
 * Global Error Code Registry
5
 *
6
 * - [10xxxx] FormSG Errors
7
 * - [11xxxx] Auth Errors
8
 * - [12xxxx] Database Errors
9
 * - [13xxxx] Payment Errors
10
 * - [14xxxx] Communication Channel Errors
11
 * - [15xxxx] Verification Errors
12
 * - [19xxxx] Other Errors
13
 * Group in general categories for easy datadog queries
14
 * Group in sub groups for easy allocation, identification with screaming snake case prefix of the module
15
 */
16
export enum ErrorCodes {
242✔
17
  // [10xxxx] FormSG Errors ----------------------------------------------------
18
  // [100000 - 100099] General Form Errors (/modules/form)
19
  FORM_PRIVATE_FORM = 100000,
242✔
20
  FORM_NOT_FOUND = 100001,
242✔
21
  FORM_DELETED = 100002,
242✔
22
  FORM_FORBIDDEN_FORM = 100003,
242✔
23
  FORM_TRANSFER_OWNERSHIP = 100004,
242✔
24
  FORM_LOGIC_NOT_FOUND = 100005,
242✔
25
  FORM_AUTH_TYPE_MISMATCH = 100006,
242✔
26
  FORM_AUTH_NO_ESRVC_ID = 100007,
242✔
27
  FORM_RESPONDENT_NOT_WHITELISTED = 100008,
242✔
28
  FORM_RESPONDENT_SINGLE_SUBMISSION_VALIDATION_FAILED = 100009,
242✔
29
  FORM_UNEXPECTED_WHITELIST_SETTING_NOT_FOUND = 100010,
242✔
30
  FORM_INVALID_RESPONSE_MODE = 100011,
242✔
31
  // [100100 - 100199] Admin Form Errors (/modules/form/admin-form)
32
  ADMIN_FORM_INVALID_FILE_TYPE = 100100,
242✔
33
  ADMIN_FORM_EDIT_FIELD = 100101,
242✔
34
  ADMIN_FORM_FIELD_NOT_FOUND = 100102,
242✔
35
  ADMIN_FORM_INVALID_COLLABORATOR = 100103,
242✔
36
  ADMIN_FORM_PAYMENT_CHANNEL_NOT_FOUND = 100104,
242✔
37
  ADMIN_FORM_GOGOV = 100105,
242✔
38
  ADMIN_FORM_GOGOV_VALIDATION = 100106,
242✔
39
  ADMIN_FORM_GOGOV_ALREADY_EXIST = 100107,
242✔
40
  ADMIN_FORM_GOGOV_REQUEST_LIMIT = 100108,
242✔
41
  ADMIN_FORM_GOGOV_BAD_GATEWAY = 100109,
242✔
42
  ADMIN_FORM_GOGOV_SERVER = 100110,
242✔
43
  ADMIN_FORM_INVALID_APPROVAL_FIELD_TYPE = 100111,
242✔
44
  ADMIN_FORM_MODEL_RESPONSE_INVALID_SYNTAX = 100112,
242✔
45
  ADMIN_FORM_MODEL_RESPONSE_INVALID_SCHEMA_FORMAT = 100113,
242✔
46
  ADMIN_FORM_MODEL_RESPONSE_FAILURE = 100114,
242✔
47
  ADMIN_FORM_MODEL_GET_CLIENT_FAILURE = 100115,
242✔
48
  // [100200 - 100299] Submission Errors (/modules/submission)
49
  SUBMISSION_CONFLICT = 100200,
242✔
50
  SUBMISSION_NOT_FOUND = 100201,
242✔
51
  SUBMISSION_PENDING_NOT_FOUND = 100202,
242✔
52
  SUBMISSION_INVALID_TYPE = 100203,
242✔
53
  SUBMISSION_INVALID_ENCODING = 100204,
242✔
54
  SUBMISSION_PROCESSING = 100205,
242✔
55
  SUBMISSION_VALIDATE_FIELD = 100206,
242✔
56
  SUBMISSION_VALIDATE_FIELD_V3 = 100702,
242✔
57
  SUBMISSION_SEND_EMAIL_CONFIRMATION = 100207,
242✔
58
  SUBMISSION_WRONG_RESPONSE_MODE = 100208,
242✔
59
  SUBMISSION_ATTACHMENT_TOO_LARGE = 100209,
242✔
60
  SUBMISSION_INVALID_FILE_EXTENSION = 100210,
242✔
61
  SUBMISSION_FAILED = 100211,
242✔
62
  SUBMISSION_INVALID_FIELD_ID = 100212,
242✔
63
  SUBMISSION_ATTACHMENT_SIZE_LIMIT_EXCEEDED = 100213,
242✔
64
  SUBMISSION_FEATURE_DISABLED = 100214,
242✔
65
  SUBMISSION_INVALID_FILE_KEY = 100215,
242✔
66
  SUBMISSION_VIRUS_SCAN_FAILED = 100216,
242✔
67
  SUBMISSION_JSON_PARSE_FAILED = 100217,
242✔
68
  SUBMISSION_DOWNLOAD_CLEAN_FILE_FAILED = 100218,
242✔
69
  SUBMISSION_PARSE_VIRUS_SCANNER_LAMBDA_PAYLOAD = 100219,
242✔
70
  SUBMISSION_MALICIOUS_FILE_DETECTED = 100220,
242✔
71
  SUBMISSION_INVALID_WORKFLOW_TYPE = 100221,
242✔
72
  SUBMISSION_ATTACHMENT_UPLOAD = 100222,
242✔
73
  SUBMISSION_EXPECTED_RESPONSE_NOT_FOUND = 100224,
242✔
74
  SUBMISSION_SAVE_FAILURE = 100225,
242✔
75
  SUBMISSION_MRF_REMINDER_INVALID_PENDING_STEP = 100226,
242✔
76
  SUBMISSION_MRF_REMINDER_RECIPIENT_EMAILS_EMPTY = 100227,
242✔
77
  // Email Submission Errors (email mode deprecated soon)
78
  EMAIL_SUBMISSION_HASH = 100223,
242✔
79
  // [100300 - 100399] Receiver Errors (/modules/submission/receiver)
80
  RECEIVER_INITIALISE_MULTIPART_RECEIVER = 100301,
242✔
81
  RECEIVER_MULTIPART_CONTENT_LIMIT = 100302,
242✔
82
  RECEIVER_MULTIPART_CONTENT_PARSING = 100303,
242✔
83
  RECEIVER_MULTIPART_ERROR = 100304,
242✔
84
  // [100400 - 100499] Encrypt Submission Errors (/modules/submission/encrypt-submission)
85
  ENCRYPT_FORMSG_REQ_BODY_EXISTS = 100400,
242✔
86
  ENCRYPT_ENCRYPTED_PAYLOAD_EXISTS = 100401,
242✔
87
  // [100500 - 100599] Feedback Errors (/modules/feedback)
88
  FEEDBACK_INVALID_SUBMISSION_ID = 100500,
242✔
89
  FEEDBACK_DUPLICATE_SUBMISSION = 100501,
242✔
90
  // [100600 - 100699] Admin Feedback Errors (/modules/admin-feedback)
91
  ADMIN_FEEDBACK_MISSING = 100600,
242✔
92
  // [100700 - 100799] Workspace Errors (/modules/workspace)
93
  WORKSPACE_NOT_FOUND = 100700,
242✔
94
  WORKSPACE_FORBIDDEN = 100701,
242✔
95
  // End FormSG Errors ---------------------------------------------------------
96

97
  // [11xxxx] Auth Errors ------------------------------------------------------
98
  // [110000 - 110099] General Auth Errors (/modules/auth)
99
  AUTH_INVALID_DOMAIN = 110000,
242✔
100
  AUTH_INVALID_OTP = 110001,
242✔
101
  AUTH_INVALID_TOKEN = 110002,
242✔
102
  AUTH_MISSING_TOKEN = 110003,
242✔
103
  AUTH_UNAUTHORIZED = 110004,
242✔
104
  // [110100 - 110199] SPCP Errors (/modules/spcp)
105
  SPCP_CREATE_REDIRECT_URL = 110100,
242✔
106
  SPCP_VERIFY_JWT = 110101,
242✔
107
  SPCP_MISSING_ATTRIBUTES = 110102,
242✔
108
  SPCP_INVALID_JWT = 110103,
242✔
109
  SPCP_MISSING_JWT = 110104,
242✔
110
  SPCP_INVALID_ID_TOKEN = 110105,
242✔
111
  SPCP_INVALID_STATE = 110106,
242✔
112
  SPCP_CREATE_JWT = 110107,
242✔
113
  SPCP_EXCHANGE_AUTH_TOKEN = 110108,
242✔
114
  // [110200 - 110299] SPCP OIDC Errors (/modules/spcp)
115
  SPCP_OIDC_CREATE_AUTHORISATION_URL = 110200,
242✔
116
  SPCP_OIDC_CREATE_JWT = 110201,
242✔
117
  SPCP_OIDC_GET_SIGNING_KEY = 110202,
242✔
118
  SPCP_OIDC_GET_DECRYPTION_KEY = 110203,
242✔
119
  SPCP_OIDC_GET_VERIFICATION_KEY = 110204,
242✔
120
  SPCP_OIDC_INVALID_ID_TOKEN = 110205,
242✔
121
  SPCP_OIDC_JWK_SHAPE_INVALID = 110206,
242✔
122
  SPCP_OIDC_MISSING_ID_TOKEN = 110207,
242✔
123
  SPCP_OIDC_INVALID_VERIFICATION_KEY = 110208,
242✔
124
  SPCP_OIDC_EXCHANGE_AUTH_TOKEN = 110209,
242✔
125
  // [110300 - 110399] MyInfo Errors (/modules/myinfo)
126
  MYINFO_CIRCUIT_BREAKER = 110300,
242✔
127
  MYINFO_FETCH = 110301,
242✔
128
  MYINFO_HASHING = 110302,
242✔
129
  MYINFO_MISSING_HASH = 110303,
242✔
130
  MYINFO_HASH_DID_NOT_MATCH = 110304,
242✔
131
  MYINFO_PARSE_RELAY_STATE = 110305,
242✔
132
  MYINFO_MISSING_LOGIN_COOKIE = 110306,
242✔
133
  MYINFO_INVALID_LOGIN_COOKIE = 110307,
242✔
134
  MYINFO_INVALID_AUTH_CODE_COOKIE = 110308,
242✔
135
  MYINFO_COOKIE_STATE = 110309,
242✔
136
  // [110400 - 110499] Sgid Errors (/modules/sgid)
137
  SGID_CREATE_REDIRECT_URL = 110400,
242✔
138
  SGID_INVALID_STATE = 110401,
242✔
139
  SGID_FETCH_ACCESS_TOKEN = 110402,
242✔
140
  SGID_FETCH_USER_INFO = 110403,
242✔
141
  SGID_MALFORMED_MYINFO_COOKIE = 110404,
242✔
142
  SGID_VERIFY_JWT = 110405,
242✔
143
  SGID_INVALID_JWT = 110406,
242✔
144
  SGID_MISSING_JWT = 110407,
242✔
145
  // End of Auth Errors --------------------------------------------------------
146

147
  // [12xxxx] Database Errors (/modules/core) ----------------------------------
148
  DATABASE_ERROR = 120000,
242✔
149
  DATABASE_VALIDATION = 120001,
242✔
150
  DATABASE_CONFLICT = 120002,
242✔
151
  DATABASE_PAYLOAD_SIZE = 120003,
242✔
152
  DATABASE_DUPLICATE_KEY = 120004,
242✔
153
  DATABASE_WRITE_CONFLICT = 120005,
242✔
154
  // End of Database Errors ----------------------------------------------------
155

156
  // [13xxxx] Payment Errors ---------------------------------------------------
157
  // [130000 - 130099] General Payment Errors (/modules/payments)
158
  PAYMENT_INVALID_AMOUNT = 130000,
242✔
159
  PAYMENT_NOT_FOUND = 130001,
242✔
160
  PAYMENT_CONFIRMED_PAYMENT_NOT_FOUND = 130002,
242✔
161
  PAYMENT_ALREADY_CONFIRMED = 130003,
242✔
162
  PAYMENT_ACCOUNT_INFORMATION = 130004,
242✔
163
  PAYMENT_INVALID_PAYMENT_PRODUCTS = 130005,
242✔
164
  PAYMENT_CONFIGURATION = 130006,
242✔
165
  // [130100 - 130199] Stripe Errors (/modules/payments)
166
  PAYMENT_STRIPE_SUCCESSFUL_CHARGE_NOT_FOUND = 130100,
242✔
167
  PAYMENT_STRIPE_TRANSACTION_FEE_NOT_FOUND = 130101,
242✔
168
  PAYMENT_STRIPE_MALFORMED_CHARGE_OBJECT = 130102,
242✔
169
  PAYMENT_STRIPE_MALFORMED_EVENT_OBJECT = 130103,
242✔
170
  PAYMENT_STRIPE_METADATA_INVALID = 130104,
242✔
171
  PAYMENT_STRIPE_METADATA_VALID_PAYMENT_ID_NOT_FOUND = 130105,
242✔
172
  PAYMENT_STRIPE_METADATA_INCORRECT_ENV = 130106,
242✔
173
  PAYMENT_STRIPE_FETCH_ERROR = 130107,
242✔
174
  PAYMENT_STRIPE_ACCOUNT_ERROR = 130108,
242✔
175
  PAYMENT_STRIPE_COMPUTE_PAYMENT_STATE = 130109,
242✔
176
  // [130200 - 130299] Payment Proof Errors (/modules/payments)
177
  PAYMENT_PROOF_INVOICE_PDF_GENERATION = 130200,
242✔
178
  PAYMENT_PROOF_UPLOAD_S3 = 130201,
242✔
179
  PAYMENT_PROOF_PRESIGN_S3 = 130202,
242✔
180
  // [130300 - 130399] Billing Errors (/modules/billing)
181
  BILLING_FORM_HAS_NO_AUTH = 130300,
242✔
182
  // End of Payment Errors -----------------------------------------------------
183

184
  // [14xxxx] Communication Channel Errors (SMS, Email, Webhook) ---------------
185
  // [140000 - 140099] SMS Errors (/services/postman-sms)
186
  POSTMAN_SMS_SEND = 140000,
242✔
187
  POSTMAN_INVALID_NUMBER = 140001,
242✔
188
  // [140100 - 140199] Mail Errors (/services/mail)
189
  MAIL_SEND_ERROR = 140100,
242✔
190
  MAIL_GENERATION_ERROR = 140101,
242✔
191
  // [140200 - 140299] Webhook Errors (/modules/webhook)
192
  WEBHOOK_VALIDATION = 140200,
242✔
193
  WEBHOOK_FAILED_WITH_PRESIGNED_URL_GENERATION = 140201,
242✔
194
  WEBHOOK_FAILED_WITH_UNKNOWN_ERROR = 140202,
242✔
195
  WEBHOOK_FAILED_WITH_AXIOS_ERROR = 140203,
242✔
196
  WEBHOOK_QUEUE_MESSAGE_PARSING_ERROR = 140204,
242✔
197
  WEBHOOK_NO_MORE_RETRIES = 140205,
242✔
198
  WEBHOOK_PUSH_TO_QUEUE = 140206,
242✔
199
  WEBHOOK_RETRIES_NOT_ENABLED = 140207,
242✔
200
  // [140300 - 140399] Bounce Errors (/modules/bounce)
201
  BOUNCE_INVALID_NOTIFCATION = 140300,
242✔
202
  BOUNCE_SEND_BOUNCE_SMS_NOTIFICATION = 140301,
242✔
203
  BOUNCE_MISSING_EMAIL_HEADERS = 140302,
242✔
204
  BOUNCE_PARSE_NOTIFICATION = 140303,
242✔
205
  // End of Communication Channel Errors ---------------------------------------
206

207
  // [15xxxx] Verification Errors ----------------------------------------------
208
  // [150000 - 150099] General Verification Errors (/modules/verification)
209
  VERIFICATION_TRANSACTION_NOT_FOUND = 150000,
242✔
210
  VERIFICATION_FIELD_NOT_FOUND_IN_TRANSACTION = 150001,
242✔
211
  VERIFICATION_TRANSACTION_EXPIRED = 150002,
242✔
212
  VERIFICATION_OTP_EXPIRED = 150003,
242✔
213
  VERIFICATION_MISSING_HASH_DATA = 150004,
242✔
214
  VERIFICATION_OTP_RETRY_EXCEEDED = 150005,
242✔
215
  VERIFICATION_WRONG_OTP = 150006,
242✔
216
  VERIFICATION_WAIT_FOR_OTP = 150007,
242✔
217
  VERIFICATION_OTP_REQUEST_COUNT_EXCEEDED = 150008,
242✔
218
  VERIFICATION_NON_VERIFIED_FIELD_TYPE = 150009,
242✔
219
  VERIFICATION_SMS_LIMIT_EXCEEDED = 150010,
242✔
220
  VERIFICATION_OTP_REQUEST_ERROR = 150011,
242✔
221
  // [150100 - 150199] Captcha Errors (/services/captcha)
222
  CAPTCHA_CONNECTION = 150100,
242✔
223
  CAPTCHA_VERIFY = 150101,
242✔
224
  CAPTCHA_MISSING = 150102,
242✔
225
  // [150200 - 150299] Turnstile Errors (/services/turnstile)
226
  TURNSTILE_CONNECTION = 150200,
242✔
227
  TURNSTILE_RESPONSE_ERROR = 150201,
242✔
228
  TURNSTILE_MISSING = 150202,
242✔
229
  // End of Verification Errors ------------------------------------------------
230

231
  // [19xxxx] Other Errors -----------------------------------------------------
232
  // [190000 - 190099] Core Errors (/modules/core)
233
  MALFORMED_PARAMETERS = 190000,
242✔
234
  EMPTY_ERROR_FIELD = 190001,
242✔
235
  SECRETS_MANAGER = 190002,
242✔
236
  SECRETS_MANAGER_NOT_FOUND = 190003,
242✔
237
  SECRETS_MANAGER_CONFLICT = 190004,
242✔
238
  TWILIO_CACHE = 190005,
242✔
239
  // [190100 - 190199] User Errors (/modules/user)
240
  USER_INVALID_OTP = 190100,
242✔
241
  USER_MISSING = 190101,
242✔
242
  // [190200 - 190299] Verified Content Errors (/modules/verified-content)
243
  VERIFIED_CONTENT_MALFORMED = 190200,
242✔
244
  VERIFIED_CONTENT_ENCRYPT_FAILURE = 190201,
242✔
245
  // End of Other Errors -------------------------------------------------------
246
}
247

248
/**
249
 * A custom base error class that encapsulates the name, message, status code,
250
 * and logging meta string (if any) for the error.
251
 */
252
export class ApplicationError extends Error {
242✔
253
  /**
254
   * Meta object to be logged by the application logger, if any.
255
   */
256
  meta?: unknown
257
  // FormSG Business Logic errors, not to be confused with HTTP Status Codes
258
  code?: number
259

260
  constructor(message?: string, meta?: unknown, errorCode?: number) {
261
    super()
2,073✔
262

263
    this.name = this.constructor.name
2,073✔
264
    this.message = message || 'Something went wrong. Please try again.'
2,073✔
265
    Error.captureStackTrace(this, this.constructor)
2,073✔
266

267
    this.meta = meta
2,073✔
268
    this.code = errorCode
2,073✔
269

270
    if (this.code) {
2,073✔
271
      setErrorCode(this)
2,024✔
272
    }
273
  }
274
}
275

276
export class DatabaseError extends ApplicationError {
242✔
277
  constructor(message?: string) {
278
    super(message, undefined, ErrorCodes.DATABASE_ERROR)
245✔
279
  }
280
}
281

282
export class DatabaseValidationError extends ApplicationError {
242✔
283
  constructor(message: string) {
284
    super(message, undefined, ErrorCodes.DATABASE_VALIDATION)
18✔
285
  }
286
}
287

288
export class DatabaseConflictError extends ApplicationError {
242✔
289
  constructor(message: string) {
290
    super(message, undefined, ErrorCodes.DATABASE_CONFLICT)
9✔
291
  }
292
}
293

294
export class DatabasePayloadSizeError extends ApplicationError {
242✔
295
  constructor(message: string) {
296
    super(message, undefined, ErrorCodes.DATABASE_PAYLOAD_SIZE)
11✔
297
  }
298
}
299

300
export class DatabaseDuplicateKeyError extends ApplicationError {
242✔
301
  constructor(message: string) {
302
    super(message, undefined, ErrorCodes.DATABASE_DUPLICATE_KEY)
1✔
303
  }
304
}
305

306
export class DatabaseWriteConflictError extends ApplicationError {
242✔
307
  constructor(message: string) {
308
    super(message, undefined, ErrorCodes.DATABASE_WRITE_CONFLICT)
×
309
  }
310
}
311

312
export class SecretsManagerError extends ApplicationError {
242✔
313
  constructor(message?: string) {
314
    super(message, undefined, ErrorCodes.SECRETS_MANAGER)
×
315
  }
316
}
317

318
export class SecretsManagerNotFoundError extends ApplicationError {
242✔
319
  constructor(message: string) {
320
    super(message, undefined, ErrorCodes.SECRETS_MANAGER_NOT_FOUND)
×
321
  }
322
}
323

324
export class SecretsManagerConflictError extends ApplicationError {
242✔
325
  constructor(message: string) {
326
    super(message, undefined, ErrorCodes.SECRETS_MANAGER_CONFLICT)
×
327
  }
328
}
329

330
/**
331
 * Union of all possible database errors
332
 */
333
export type PossibleDatabaseError =
334
  | DatabaseError
335
  | DatabaseValidationError
336
  | DatabaseConflictError
337
  | DatabasePayloadSizeError
338
  | DatabaseDuplicateKeyError
339
  | DatabaseWriteConflictError
340

341
export class MalformedParametersError extends ApplicationError {
242✔
342
  constructor(message: string, meta?: unknown) {
343
    super(message, meta, ErrorCodes.MALFORMED_PARAMETERS)
18✔
344
  }
345
}
346

347
/**
348
 * A custom error class returned when a method explicitly returns a list of errors
349
 * but the list itself is empty.
350
 */
351
export class EmptyErrorFieldError extends ApplicationError {
242✔
352
  constructor(message = 'Errors were returned but list is empty.') {
×
353
    super(message, undefined, ErrorCodes.EMPTY_ERROR_FIELD)
×
354
  }
355
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc