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

opengovsg / FormSG / 10920991287

18 Sep 2024 11:28AM CUT coverage: 73.583% (-0.3%) from 73.836%
10920991287

push

github

Ken
chore: update deprecated

2287 of 3861 branches covered (59.23%)

Branch coverage included in aggregate %.

9323 of 11917 relevant lines covered (78.23%)

43.51 hits per line

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

97.12
/src/app/modules/core/core.errors.ts
1
import { setErrorCode } from '../datadog/datadog.utils'
239✔
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 {
239✔
17
  // [10xxxx] FormSG Errors ----------------------------------------------------
18
  // [100000 - 100099] General Form Errors (/modules/form)
19
  FORM_PRIVATE_FORM = 100000,
239✔
20
  FORM_NOT_FOUND = 100001,
239✔
21
  FORM_DELETED = 100002,
239✔
22
  FORM_FORBIDDEN_FORM = 100003,
239✔
23
  FORM_TRANSFER_OWNERSHIP = 100004,
239✔
24
  FORM_LOGIC_NOT_FOUND = 100005,
239✔
25
  FORM_AUTH_TYPE_MISMATCH = 100006,
239✔
26
  FORM_AUTH_NO_ESRVC_ID = 100007,
239✔
27
  ADMIN_FORM_INVALID_FILE_TYPE = 100100,
239✔
28
  ADMIN_FORM_EDIT_FIELD = 100101,
239✔
29
  ADMIN_FORM_FIELD_NOT_FOUND = 100102,
239✔
30
  ADMIN_FORM_INVALID_COLLABORATOR = 100103,
239✔
31
  ADMIN_FORM_PAYMENT_CHANNEL_NOT_FOUND = 100104,
239✔
32
  ADMIN_FORM_GOGOV = 100105,
239✔
33
  ADMIN_FORM_GOGOV_VALIDATION = 100106,
239✔
34
  ADMIN_FORM_GOGOV_ALREADY_EXIST = 100107,
239✔
35
  ADMIN_FORM_GOGOV_REQUEST_LIMIT = 100108,
239✔
36
  ADMIN_FORM_GOGOV_BAD_GATEWAY = 100109,
239✔
37
  ADMIN_FORM_GOGOV_SERVER = 100110,
239✔
38
  // [100200 - 100299] Submission Errors (/modules/submission)
39
  SUBMISSION_CONFLICT = 100200,
239✔
40
  SUBMISSION_NOT_FOUND = 100201,
239✔
41
  SUBMISSION_PENDING_NOT_FOUND = 100202,
239✔
42
  SUBMISSION_INVALID_TYPE = 100203,
239✔
43
  SUBMISSION_INVALID_ENCODING = 100204,
239✔
44
  SUBMISSION_PROCESSING = 100205,
239✔
45
  SUBMISSION_VALIDATE_FIELD = 100206,
239✔
46
  SUBMISSION_SEND_EMAIL_CONFIRMATION = 100207,
239✔
47
  SUBMISSION_WRONG_RESPONSE_MODE = 100208,
239✔
48
  SUBMISSION_ATTACHMENT_TOO_LARGE = 100209,
239✔
49
  SUBMISSION_INVALID_FILE_EXTENSION = 100210,
239✔
50
  SUBMISSION_FAILED = 100211,
239✔
51
  SUBMISSION_INVALID_FIELD_ID = 100212,
239✔
52
  SUBMISSION_ATTACHMENT_SIZE_LIMIT_EXCEEDED = 100213,
239✔
53
  SUBMISSION_FEATURE_DISABLED = 100214,
239✔
54
  SUBMISSION_INVALID_FILE_KEY = 100215,
239✔
55
  SUBMISSION_VIRUS_SCAN_FAILED = 100216,
239✔
56
  SUBMISSION_JSON_PARSE_FAILED = 100217,
239✔
57
  SUBMISSION_DOWNLOAD_CLEAN_FILE_FAILED = 100218,
239✔
58
  SUBMISSION_PARSE_VIRUS_SCANNER_LAMBDA_PAYLOAD = 100219,
239✔
59
  SUBMISSION_MALICIOUS_FILE_DETECTED = 100220,
239✔
60
  SUBMISSION_INVALID_WORKFLOW_TYPE = 100221,
239✔
61
  SUBMISSION_ATTACHMENT_UPLOAD = 100222,
239✔
62
  // Email Submission Errors (email mode deprecated soon)
63
  EMAIL_SUBMISSION_HASH = 100223,
239✔
64
  // [100300 - 100399] Receiver Errors (/modules/submission/receiver)
65
  RECEIVER_INITIALISE_MULTIPART_RECEIVER = 100301,
239✔
66
  RECEIVER_MULTIPART_CONTENT_LIMIT = 100302,
239✔
67
  RECEIVER_MULTIPART_CONTENT_PARSING = 100303,
239✔
68
  RECEIVER_MULTIPART_ERROR = 100304,
239✔
69
  // [100400 - 100499] Encrypt Submission Errors (/modules/submission/encrypt-submission)
70
  ENCRYPT_FORMSG_REQ_BODY_EXISTS = 100400,
239✔
71
  ENCRYPT_ENCRYPTED_PAYLOAD_EXISTS = 100401,
239✔
72
  // [100500 - 100599] Feedback Errors (/modules/feedback)
73
  FEEDBACK_INVALID_SUBMISSION_ID = 100500,
239✔
74
  FEEDBACK_DUPLICATE_SUBMISSION = 100501,
239✔
75
  // [100600 - 100699] Admin Feedback Errors (/modules/admin-feedback)
76
  ADMIN_FEEDBACK_MISSING = 100600,
239✔
77
  // [100700 - 100799] Workspace Errors (/modules/workspace)
78
  WORKSPACE_NOT_FOUND = 100700,
239✔
79
  WORKSPACE_FORBIDDEN = 100701,
239✔
80
  // End FormSG Errors ---------------------------------------------------------
81

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

132
  // [12xxxx] Database Errors (/modules/core) ----------------------------------
133
  DATABASE_ERROR = 120000,
239✔
134
  DATABASE_VALIDATION = 120001,
239✔
135
  DATABASE_CONFLICT = 120002,
239✔
136
  DATABASE_PAYLOAD_SIZE = 120003,
239✔
137
  DATABASE_DUPLICATE_KEY = 120004,
239✔
138
  DATABASE_WRITE_CONFLICT = 120005,
239✔
139
  // End of Database Errors ----------------------------------------------------
140

141
  // [13xxxx] Payment Errors ---------------------------------------------------
142
  // [130000 - 130099] General Payment Errors (/modules/payments)
143
  PAYMENT_INVALID_AMOUNT = 130000,
239✔
144
  PAYMENT_NOT_FOUND = 130001,
239✔
145
  PAYMENT_CONFIRMED_PAYMENT_NOT_FOUND = 130002,
239✔
146
  PAYMENT_ALREADY_CONFIRMED = 130003,
239✔
147
  PAYMENT_ACCOUNT_INFORMATION = 130004,
239✔
148
  PAYMENT_INVALID_PAYMENT_PRODUCTS = 130005,
239✔
149
  PAYMENT_CONFIGURATION = 130006,
239✔
150
  // [130100 - 130199] Stripe Errors (/modules/payments)
151
  PAYMENT_STRIPE_SUCCESSFUL_CHARGE_NOT_FOUND = 130100,
239✔
152
  PAYMENT_STRIPE_TRANSACTION_FEE_NOT_FOUND = 130101,
239✔
153
  PAYMENT_STRIPE_MALFORMED_CHARGE_OBJECT = 130102,
239✔
154
  PAYMENT_STRIPE_MALFORMED_EVENT_OBJECT = 130103,
239✔
155
  PAYMENT_STRIPE_METADATA_INVALID = 130104,
239✔
156
  PAYMENT_STRIPE_METADATA_VALID_PAYMENT_ID_NOT_FOUND = 130105,
239✔
157
  PAYMENT_STRIPE_METADATA_INCORRECT_ENV = 130106,
239✔
158
  PAYMENT_STRIPE_FETCH_ERROR = 130107,
239✔
159
  PAYMENT_STRIPE_ACCOUNT_ERROR = 130108,
239✔
160
  PAYMENT_STRIPE_COMPUTE_PAYMENT_STATE = 130109,
239✔
161
  // [130200 - 130299] Payment Proof Errors (/modules/payments)
162
  PAYMENT_PROOF_INVOICE_PDF_GENERATION = 130200,
239✔
163
  PAYMENT_PROOF_UPLOAD_S3 = 130201,
239✔
164
  PAYMENT_PROOF_PRESIGN_S3 = 130202,
239✔
165
  // [130300 - 130399] Billing Errors (/modules/billing)
166
  BILLING_FORM_HAS_NO_AUTH = 130300,
239✔
167
  // End of Payment Errors -----------------------------------------------------
168

169
  // [14xxxx] Communication Channel Errors (SMS, Email, Webhook) ---------------
170
  // [140000 - 140099] SMS Errors (/services/postman-sms)
171
  POSTMAN_SMS_SEND = 140000,
239✔
172
  POSTMAN_INVALID_NUMBER = 140001,
239✔
173
  // [140100 - 140199] Mail Errors (/services/mail)
174
  MAIL_SEND_ERROR = 140100,
239✔
175
  MAIL_GENERATION_ERROR = 140101,
239✔
176
  // [140200 - 140299] Webhook Errors (/modules/webhook)
177
  WEBHOOK_VALIDATION = 140200,
239✔
178
  WEBHOOK_FAILED_WITH_PRESIGNED_URL_GENERATION = 140201,
239✔
179
  WEBHOOK_FAILED_WITH_UNKNOWN_ERROR = 140202,
239✔
180
  WEBHOOK_FAILED_WITH_AXIOS_ERROR = 140203,
239✔
181
  WEBHOOK_QUEUE_MESSAGE_PARSING_ERROR = 140204,
239✔
182
  WEBHOOK_NO_MORE_RETRIES = 140205,
239✔
183
  WEBHOOK_PUSH_TO_QUEUE = 140206,
239✔
184
  WEBHOOK_RETRIES_NOT_ENABLED = 140207,
239✔
185
  // [140300 - 140399] Bounce Errors (/modules/bounce)
186
  BOUNCE_INVALID_NOTIFCATION = 140300,
239✔
187
  BOUNCE_SEND_BOUNCE_SMS_NOTIFICATION = 140301,
239✔
188
  BOUNCE_MISSING_EMAIL_HEADERS = 140302,
239✔
189
  BOUNCE_PARSE_NOTIFICATION = 140303,
239✔
190
  // End of Communication Channel Errors ---------------------------------------
191

192
  // [15xxxx] Verification Errors ----------------------------------------------
193
  // [150000 - 150099] General Verification Errors (/modules/verification)
194
  VERIFICATION_TRANSACTION_NOT_FOUND = 150000,
239✔
195
  VERIFICATION_FIELD_NOT_FOUND_IN_TRANSACTION = 150001,
239✔
196
  VERIFICATION_TRANSACTION_EXPIRED = 150002,
239✔
197
  VERIFICATION_OTP_EXPIRED = 150003,
239✔
198
  VERIFICATION_MISSING_HASH_DATA = 150004,
239✔
199
  VERIFICATION_OTP_RETRY_EXCEEDED = 150005,
239✔
200
  VERIFICATION_WRONG_OTP = 150006,
239✔
201
  VERIFICATION_WAIT_FOR_OTP = 150007,
239✔
202
  VERIFICATION_OTP_REQUEST_COUNT_EXCEEDED = 150008,
239✔
203
  VERIFICATION_NON_VERIFIED_FIELD_TYPE = 150009,
239✔
204
  VERIFICATION_SMS_LIMIT_EXCEEDED = 150010,
239✔
205
  VERIFICATION_OTP_REQUEST_ERROR = 150011,
239✔
206
  // [150100 - 150199] Captcha Errors (/services/captcha)
207
  CAPTCHA_CONNECTION = 150100,
239✔
208
  CAPTCHA_VERIFY = 150101,
239✔
209
  CAPTCHA_MISSING = 150102,
239✔
210
  // [150200 - 150299] Turnstile Errors (/services/turnstile)
211
  TURNSTILE_CONNECTION = 150200,
239✔
212
  TURNSTILE_RESPONSE_ERROR = 150201,
239✔
213
  TURNSTILE_MISSING = 150202,
239✔
214
  // End of Verification Errors ------------------------------------------------
215

216
  // [19xxxx] Other Errors -----------------------------------------------------
217
  // [190000 - 190099] Core Errors (/modules/core)
218
  MALFORMED_PARAMETERS = 190000,
239✔
219
  EMPTY_ERROR_FIELD = 190001,
239✔
220
  SECRETS_MANAGER = 190002,
239✔
221
  SECRETS_MANAGER_NOT_FOUND = 190003,
239✔
222
  SECRETS_MANAGER_CONFLICT = 190004,
239✔
223
  TWILIO_CACHE = 190005,
239✔
224
  // [190100 - 190199] User Errors (/modules/user)
225
  USER_INVALID_OTP = 190100,
239✔
226
  USER_MISSING = 190101,
239✔
227
  // [190200 - 190299] Verified Content Errors (/modules/verified-content)
228
  VERIFIED_CONTENT_MALFORMED = 190200,
239✔
229
  VERIFIED_CONTENT_ENCRYPT_FAILURE = 190201,
239✔
230
  // End of Other Errors -------------------------------------------------------
231
}
232

233
/**
234
 * A custom base error class that encapsulates the name, message, status code,
235
 * and logging meta string (if any) for the error.
236
 */
237
export class ApplicationError extends Error {
239✔
238
  /**
239
   * Meta object to be logged by the application logger, if any.
240
   */
241
  meta?: unknown
242
  // FormSG Business Logic errors, not to be confused with HTTP Status Codes
243
  code?: number
244

245
  constructor(message?: string, meta?: unknown, errorCode?: number) {
246
    super()
1,738✔
247

248
    this.name = this.constructor.name
1,738✔
249
    this.message = message || 'Something went wrong. Please try again.'
1,738✔
250
    Error.captureStackTrace(this, this.constructor)
1,738✔
251

252
    this.meta = meta
1,738✔
253
    this.code = errorCode
1,738✔
254

255
    if (this.code) {
1,738✔
256
      setErrorCode(this)
1,704✔
257
    }
258
  }
259
}
260

261
export class DatabaseError extends ApplicationError {
239✔
262
  constructor(message?: string) {
263
    super(message, undefined, ErrorCodes.DATABASE_ERROR)
251✔
264
  }
265
}
266

267
export class DatabaseValidationError extends ApplicationError {
239✔
268
  constructor(message: string) {
269
    super(message, undefined, ErrorCodes.DATABASE_VALIDATION)
18✔
270
  }
271
}
272

273
export class DatabaseConflictError extends ApplicationError {
239✔
274
  constructor(message: string) {
275
    super(message, undefined, ErrorCodes.DATABASE_CONFLICT)
9✔
276
  }
277
}
278

279
export class DatabasePayloadSizeError extends ApplicationError {
239✔
280
  constructor(message: string) {
281
    super(message, undefined, ErrorCodes.DATABASE_PAYLOAD_SIZE)
11✔
282
  }
283
}
284

285
export class DatabaseDuplicateKeyError extends ApplicationError {
239✔
286
  constructor(message: string) {
287
    super(message, undefined, ErrorCodes.DATABASE_DUPLICATE_KEY)
1✔
288
  }
289
}
290

291
export class DatabaseWriteConflictError extends ApplicationError {
239✔
292
  constructor(message: string) {
293
    super(message, undefined, ErrorCodes.DATABASE_WRITE_CONFLICT)
×
294
  }
295
}
296

297
export class SecretsManagerError extends ApplicationError {
239✔
298
  constructor(message?: string) {
299
    super(message, undefined, ErrorCodes.SECRETS_MANAGER)
2✔
300
  }
301
}
302

303
export class SecretsManagerNotFoundError extends ApplicationError {
239✔
304
  constructor(message: string) {
305
    super(message, undefined, ErrorCodes.SECRETS_MANAGER_NOT_FOUND)
×
306
  }
307
}
308

309
export class SecretsManagerConflictError extends ApplicationError {
239✔
310
  constructor(message: string) {
311
    super(message, undefined, ErrorCodes.SECRETS_MANAGER_CONFLICT)
×
312
  }
313
}
314

315
export class TwilioCacheError extends ApplicationError {
239✔
316
  constructor(message?: string) {
317
    super(message, undefined, ErrorCodes.TWILIO_CACHE)
×
318
  }
319
}
320

321
/**
322
 * Union of all possible database errors
323
 */
324
export type PossibleDatabaseError =
325
  | DatabaseError
326
  | DatabaseValidationError
327
  | DatabaseConflictError
328
  | DatabasePayloadSizeError
329
  | DatabaseDuplicateKeyError
330
  | DatabaseWriteConflictError
331

332
export class MalformedParametersError extends ApplicationError {
239✔
333
  constructor(message: string, meta?: unknown) {
334
    super(message, meta, ErrorCodes.MALFORMED_PARAMETERS)
17✔
335
  }
336
}
337

338
/**
339
 * A custom error class returned when a method explicitly returns a list of errors
340
 * but the list itself is empty.
341
 */
342
export class EmptyErrorFieldError extends ApplicationError {
239✔
343
  constructor(message = 'Errors were returned but list is empty.') {
×
344
    super(message, undefined, ErrorCodes.EMPTY_ERROR_FIELD)
×
345
  }
346
}
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

© 2025 Coveralls, Inc