UNPKG

2.46 kBJavaScriptView Raw
1const fetch = require('node-fetch')
2const oauth2Client = require('./auth')
3
4const 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
11function 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
24function 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
34const 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
41const loginUrl = async () => {
42 const auth = await oauth2Client()
43 return auth.generateAuthUrl({ access_type: 'offline', scope: scopes })
44}
45
46async 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
56const getProfile = accessToken => createFetch({
57 accessToken,
58 endpoint: '/gmail/v1/users/me/profile'
59})
60
61async 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
84async 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
90async 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
99module.exports = {
100 loginUrl,
101 getToken,
102 getEmails,
103 getEmail,
104 getMessagesList,
105 getProfile
106}