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

opengovsg / FormSG / 14049170525

25 Mar 2025 01:13AM UTC coverage: 72.481% (+0.06%) from 72.421%
14049170525

push

github

scottheng96
removed ununsed imports and comments

2812 of 4713 branches covered (59.66%)

Branch coverage included in aggregate %.

10131 of 13144 relevant lines covered (77.08%)

47.17 hits per line

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

56.52
/src/app/modules/form/admin-form/admin-form.assistance.controller.ts
1
import { celebrate, Joi, Segments } from 'celebrate'
7✔
2
import { AuthedSessionData } from 'express-session'
3
import { StatusCodes } from 'http-status-codes'
7✔
4

5
import { createLoggerWithLabel } from '../../../config/logger'
7✔
6
import { createReqMeta } from '../../../utils/request'
7✔
7
import * as AuthService from '../../auth/auth.service'
7✔
8
import { ControllerHandler } from '../../core/core.types'
9
import * as UserService from '../../user/user.service'
7✔
10

11
import { createFormFieldsUsingTextPrompt } from './admin-form.assistance.service'
7✔
12
import { PermissionLevel } from './admin-form.types'
7✔
13
import { mapRouteError } from './admin-form.utils'
7✔
14

15
const logger = createLoggerWithLabel(module)
7✔
16

17
const handleTextPromptValidator = celebrate({
7✔
18
  [Segments.PARAMS]: {
19
    formId: Joi.string()
20
      .required()
21
      .pattern(/^[a-fA-F0-9]{24}$/)
22
      .message('Your form ID is invalid.'),
23
  },
24
  [Segments.BODY]: {
25
    prompt: Joi.string().required().max(500),
26
  },
27
})
28

29
interface ITextPrompt {
30
  prompt: string
31
}
32

33
const _handleTextPrompt: ControllerHandler<
34
  { formId: string },
35
  { message: string; createdFieldIds?: string[] },
36
  ITextPrompt
37
> = async (req, res) => {
7✔
38
  const { formId } = req.params
×
39
  const sessionUserId = (req.session as AuthedSessionData).user._id
×
40

41
  // Step 1: Retrieve currently logged in user.
42
  return UserService.getPopulatedUserById(sessionUserId)
×
43
    .andThen((user) =>
44
      // Step 2: Retrieve form with write permission check.
45
      AuthService.getFormAfterPermissionChecks({
×
46
        user,
47
        formId,
48
        level: PermissionLevel.Write,
49
      }),
50
    ) // Step 3: Create form fields using text prompt.
51
    .andThen((form) =>
52
      createFormFieldsUsingTextPrompt({
×
53
        form,
54
        userPrompt: req.body.prompt,
55
      }),
56
    )
57
    .map((createdFieldIds) =>
58
      res.status(StatusCodes.OK).json({
×
59
        message: 'Created form fields using text prompt successfully.',
60
        createdFieldIds: createdFieldIds.map((field) => field._id.toString()),
×
61
      }),
62
    )
63
    .mapErr((error) => {
64
      logger.error({
×
65
        message: 'Error occurred creating form fields using text prompt.',
66
        meta: {
67
          action: '_handleTextPrompt',
68
          ...createReqMeta(req),
69
          userId: sessionUserId,
70
          formId,
71
          userPrompt: req.body.prompt,
72
        },
73
        error,
74
      })
75
      const { errorMessage, statusCode } = mapRouteError(error)
×
76
      return res.status(statusCode).json({ message: errorMessage })
×
77
    })
78
}
79

80
export const handleTextPrompt = [
7✔
81
  handleTextPromptValidator,
82
  _handleTextPrompt,
83
] as ControllerHandler[]
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