1 | const fetch = require('node-fetch')
|
2 | const oauth2Client = require('./auth')
|
3 |
|
4 | const headers = token => ({
|
5 | Authorization: `Bearer ${token}`,
|
6 | 'User-Agent': 'google-api-nodejs-client/0.10.0',
|
7 | host: 'www.googleapis.com',
|
8 | accept: 'application/json'
|
9 | })
|
10 |
|
11 | function handleParams ({
|
12 | base = 'https://www.googleapis.com',
|
13 | params = null,
|
14 | endpoint = '/'
|
15 | }) {
|
16 | let url = base + endpoint
|
17 | if (!params) return url
|
18 | url += '?'
|
19 | return url + Object.keys(params)
|
20 | .map(key => `${key}=${encodeURIComponent(params[key])}`)
|
21 | .join('&')
|
22 | }
|
23 |
|
24 | function createFetch (params) {
|
25 | const { accessToken } = params
|
26 | const url = handleParams(params)
|
27 | return fetch(url, {
|
28 | method: 'get',
|
29 | headers: headers(accessToken)
|
30 | })
|
31 | .then(resp => resp.json())
|
32 | }
|
33 |
|
34 | const scopes = [
|
35 | 'https://mail.google.com/',
|
36 | 'https://www.googleapis.com/auth/gmail.compose',
|
37 | 'https://www.googleapis.com/auth/gmail.modify',
|
38 | 'https://www.googleapis.com/auth/gmail.send'
|
39 | ]
|
40 |
|
41 | const loginUrl = async () => {
|
42 | const auth = await oauth2Client()
|
43 | return auth.generateAuthUrl({ access_type: 'offline', scope: scopes })
|
44 | }
|
45 |
|
46 | async function getToken (code) {
|
47 | const oauth = await oauth2Client()
|
48 | return new Promise((resolve, reject) => {
|
49 | oauth.getToken(code, (err, tokens) => {
|
50 | if (err) { reject(err) }
|
51 | resolve({ tokens })
|
52 | })
|
53 | })
|
54 | }
|
55 |
|
56 | const getProfile = accessToken => createFetch({
|
57 | accessToken,
|
58 | endpoint: '/gmail/v1/users/me/profile'
|
59 | })
|
60 |
|
61 | async function getMessagesList ({
|
62 | filter,
|
63 | next,
|
64 | accessToken
|
65 | }) {
|
66 | const params = {
|
67 | maxResults: 10
|
68 | }
|
69 | if (filter) {
|
70 | params.q = filter
|
71 | }
|
72 | if (next) {
|
73 | params.pageToken = next
|
74 | }
|
75 | const { messages, nextPageToken } = await createFetch({
|
76 | accessToken,
|
77 | endpoint: '/gmail/v1/users/me/messages',
|
78 | base: 'https://www.googleapis.com',
|
79 | params
|
80 | })
|
81 | return { messages, nextPageToken }
|
82 | }
|
83 |
|
84 | async function getEmail (params) {
|
85 | const { accessToken, id, format = 'metadata' } = params
|
86 | const endpoint = `/gmail/v1/users/me/messages/${id}`
|
87 | return createFetch({ accessToken, endpoint, params: { format } })
|
88 | }
|
89 |
|
90 | async function getEmails ({ accessToken, messages, format }) {
|
91 | if (!format) format = 'metadata'
|
92 |
|
93 | return Promise.all(messages.map((message) => {
|
94 | const endpoint = `/gmail/v1/users/me/messages/${message.id}`
|
95 | return createFetch({ accessToken, endpoint, params: { format } })
|
96 | }))
|
97 | }
|
98 |
|
99 | module.exports = {
|
100 | loginUrl,
|
101 | getToken,
|
102 | getEmails,
|
103 | getEmail,
|
104 | getMessagesList,
|
105 | getProfile
|
106 | }
|