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

ringcentral / google-forms-notification-add-in / 7551583681

17 Jan 2024 05:42AM UTC coverage: 96.97%. Remained the same
7551583681

Pull #35

github

web-flow
chore(deps): bump ansi-regex from 3.0.0 to 5.0.1

Bumps [ansi-regex](https://github.com/chalk/ansi-regex) from 3.0.0 to 5.0.1.
- [Release notes](https://github.com/chalk/ansi-regex/releases)
- [Commits](https://github.com/chalk/ansi-regex/compare/v3.0.0...v5.0.1)

---
updated-dependencies:
- dependency-name: ansi-regex
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Pull Request #35: chore(deps): bump ansi-regex from 3.0.0 to 5.0.1

223 of 239 branches covered (0.0%)

Branch coverage included in aggregate %.

641 of 652 relevant lines covered (98.31%)

14.5 hits per line

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

98.53
/src/server/routes/subscription.js
1
const { decodeJwt } = require('../lib/jwt');
4✔
2
const { User } = require('../models/userModel');
4✔
3
const { onSubscribe, onDeleteSubscription } = require('../handlers/subscriptionHandler');
4✔
4
const { GoogleClient } = require('../lib/GoogleClient');
4✔
5
const { checkAndRefreshAccessToken } = require('../lib/oauth');
4✔
6
const { getRCWebhookId } = require('../lib/getRCWebhookId');
4✔
7

8
async function getFormData(req, res) {
9
  const jwtToken = req.query.token;
10✔
10
  if (!jwtToken) {
10✔
11
    res.status(403);
1✔
12
    res.send('Error params');
1✔
13
    return;
1✔
14
  }
15
  const decodedToken = decodeJwt(jwtToken);
9✔
16
  if (!decodedToken) {
9✔
17
    res.status(401);
1✔
18
    res.send('Token invalid.');
1✔
19
    return;
1✔
20
  }
21
  const userId = decodedToken.id;
8✔
22
  let user;
23
  try {
8✔
24
    user = await User.findByPk(userId);
8✔
25
    if (!user || !user.accessToken) {
8✔
26
      res.status(401);
2✔
27
      res.send('Token invalid.');
2✔
28
      return;
2✔
29
    }
30
    await checkAndRefreshAccessToken(user);
6✔
31
    let formIds = req.query.formIds;
4✔
32
    if (!formIds) {
4✔
33
      res.status(403);
1✔
34
      res.send('Error params');
1✔
35
      return;
1✔
36
    }
37
    formIds = formIds.split(',');
3✔
38
    if (formIds.length > 10) {
3✔
39
      res.status(403);
1✔
40
      res.send('Too many forms');
1✔
41
      return;
1✔
42
    }
43
    const googleClient = new GoogleClient({ token: user.accessToken });
2✔
44
    const forms = await Promise.all(formIds.map(async (formId) => {
2✔
45
      // TODO: handle no permission issue
46
      const form = await googleClient.getForm(formId);
2✔
47
      return form;
2✔
48
    }));
49
    res.json({
2✔
50
      forms,
51
    });
52
  } catch (e) {
53
    console.error(e);
2✔
54
    if (e.response && e.response.status === 401) {
2✔
55
      if (user) {
1!
56
        user.accessToken = '';
1✔
57
        user.refreshToken = '';
1✔
58
        await user.save();
1✔
59
      }
60
      res.status(401);
1✔
61
      res.send('Unauthorized.');
1✔
62
      return;
1✔
63
    }
64
    console.error(e);
1✔
65
    res.status(500);
1✔
66
    res.send('Internal error');
1✔
67
  }
68
}
69

70
async function subscribe(req, res) {
71
  // validate jwt
72
  const jwtToken = req.body.token;
20✔
73
  if (!jwtToken) {
20✔
74
    res.status(403);
1✔
75
    res.send('Params invalid');
1✔
76
    return;
1✔
77
  }
78
  const decodedToken = decodeJwt(jwtToken);
19✔
79
  if (!decodedToken) {
19✔
80
    res.status(401);
1✔
81
    res.send('Token invalid');
1✔
82
    return;
1✔
83
  }
84

85
  // check for rcWebhookUri
86
  const rcWebhookUri = req.body.rcWebhookUri;
18✔
87
  const rcWebhookId = getRCWebhookId(rcWebhookUri);
18✔
88
  if (!rcWebhookId) {
18✔
89
    res.status(400);
3✔
90
    res.send('Invalid rcWebhookUri');
3✔
91
    return;
3✔
92
  }
93

94
  let formIds = req.body.formIds;
15✔
95
  if (!formIds || formIds.length === 0) {
15✔
96
    res.status(400);
2✔
97
    res.send('Invalid formIds');
2✔
98
    return;
2✔
99
  }
100
  formIds = formIds.split(',');
13✔
101
  if (formIds.length > 10) {
13✔
102
    res.status(400);
1✔
103
    res.send('Max 10 forms');
1✔
104
    return;
1✔
105
  }
106
  let user;
107
  // create webhook notification subscription
108
  try {
12✔
109
    // get existing user
110
    const userId = decodedToken.id;
12✔
111
    user = await User.findByPk(userId.toString());
12✔
112
    if (!user || !user.accessToken) {
12✔
113
      res.status(401);
2✔
114
      res.send('Authorization required');
2✔
115
      return;
2✔
116
    }
117
    await checkAndRefreshAccessToken(user);
10✔
118
    await onSubscribe(user, rcWebhookId, rcWebhookUri, formIds);
8✔
119
    res.status(200);
8✔
120
    res.json({
8✔
121
      result: 'ok'
122
    });
123
  }
124
  catch (e) {
125
    if (e.response && e.response.status === 401) {
2✔
126
      if (user) {
1!
127
        user.accessToken = '';
1✔
128
        user.refreshToken = '';
1✔
129
        await user.save();
1✔
130
      }
131
      res.status(401);
1✔
132
      res.send('Unauthorized');
1✔
133
      return;
1✔
134
    }
135
    console.error(e);
1✔
136
    res.status(500);
1✔
137
    res.send('Internal server error');
1✔
138
    return;
1✔
139
  }
140
}
141

142

143
async function deleteSubscription(req, res) {
144
  const jwtToken = req.body.token;
14✔
145
  if (!jwtToken) {
14✔
146
    res.status(403);
1✔
147
    res.send('Params invalid');
1✔
148
    return;
1✔
149
  }
150
  const decodedToken = decodeJwt(jwtToken);
13✔
151
  if (!decodedToken) {
13✔
152
    res.status(401);
1✔
153
    res.send('Token invalid');
1✔
154
    return;
1✔
155
  }
156

157
  // check for rcWebhookUri
158
  const rcWebhookUri = req.body.rcWebhookUri;
12✔
159
  const rcWebhookId = getRCWebhookId(rcWebhookUri);
12✔
160
  if (!rcWebhookId) {
12✔
161
    res.status(400);
1✔
162
    res.send('Invalid rcWebhookUri');
1✔
163
    return;
1✔
164
  }
165

166
  let formId = req.body.formId;
11✔
167
  if (!formId) {
11✔
168
    res.status(400);
1✔
169
    res.send('Invalid formId');
1✔
170
    return;
1✔
171
  }
172
  let user;
173
  try {
10✔
174
    const userId = decodedToken.id;
10✔
175
    user = await User.findByPk(userId.toString());
10✔
176
    if (!user || !user.accessToken) {
10✔
177
      res.status(401);
2✔
178
      res.send('Authorization required');
2✔
179
      return;
2✔
180
    }
181
    await checkAndRefreshAccessToken(user);
8✔
182
    // remove webhook notification subscription
183
    await onDeleteSubscription(user, rcWebhookId, formId);
6✔
184
    res.status(200);
6✔
185
    res.json({
6✔
186
      result: 'ok'
187
    });
188
  } catch (e) {
189
    if (e.response && e.response.status === 401) {
2✔
190
      if (user) {
1!
191
        user.accessToken = '';
1✔
192
        user.refreshToken = '';
1✔
193
        await user.save();
1✔
194
      }
195
      res.status(401);
1✔
196
      res.send('Unauthorized');
1✔
197
      return;
1✔
198
    }
199
    console.error(e);
1✔
200
    res.status(500);
1✔
201
    res.send('Internal server error');
1✔
202
  }
203
}
204

205
exports.subscribe = subscribe;
4✔
206
exports.getFormData = getFormData;
4✔
207
exports.deleteSubscription = deleteSubscription;
4✔
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