179 lines
4.9 KiB
JavaScript
179 lines
4.9 KiB
JavaScript
import ical, {ICalCalendarMethod} from 'ical-generator';
|
|
import express from "express"
|
|
import {createClient} from "@supabase/supabase-js";
|
|
import vCardsJS from "vcards-js"
|
|
import {ImapFlow} from 'imapflow'
|
|
import cors from 'cors'
|
|
|
|
const supabase = createClient(process.env.SUPABASE_URL,process.env.SUPABASE_SERVICE_ROLE_KEY)
|
|
const app = express();
|
|
app.use(cors())
|
|
|
|
/*
|
|
* TODO: Implement Auth for the Endpoints
|
|
*
|
|
*
|
|
* */
|
|
|
|
app.get("/contacts/:tenantId", async (req,res) => {
|
|
const tenantId = req.params.tenantId
|
|
let contacts = (await supabase.from("contacts").select().eq("tenant", tenantId)).data
|
|
let customers = (await supabase.from("customers").select().eq("tenant", tenantId)).data
|
|
let vendors = (await supabase.from("vendors").select().eq("tenant", tenantId)).data
|
|
console.log(contacts)
|
|
|
|
let cardsString = ""
|
|
|
|
contacts.forEach(contact => {
|
|
let vCard = vCardsJS();
|
|
vCard.firstName = contact.firstName
|
|
vCard.lastName = contact.lastName
|
|
vCard.role = contact.role
|
|
vCard.cellPhone = contact.phoneMobile
|
|
vCard.workPhone = contact.phoneHome
|
|
vCard.email = contact.email
|
|
vCard.namePrefix = contact.salutation
|
|
if(contact.customer) vCard.organization = customers.find(i => i.id === contact.customer).name
|
|
cardsString += vCard.getFormattedString()
|
|
|
|
})
|
|
|
|
|
|
|
|
//set content-type and disposition including desired filename
|
|
res.set('Content-Type', 'text/vcard; name="enesser.vcf"');
|
|
res.set('Content-Disposition', 'inline; filename="enesser.vcf"');
|
|
|
|
//send the response
|
|
res.send(cardsString);
|
|
})
|
|
|
|
app.get('/calendar/:userId', async (req, res) => {
|
|
|
|
const userId = req.params.userId
|
|
|
|
let userExisting = ((await supabase.from("profiles").select('id').eq("id", userId)).data)
|
|
console.log(userExisting)
|
|
|
|
if(userExisting) {
|
|
let events = (await supabase.from("events").select()).data
|
|
|
|
console.log(events[0].resources)
|
|
|
|
events = events.filter(i => i.resources.filter(resource => resource.id === userId).length > 0)
|
|
|
|
const cal = ical({
|
|
prodId: '//spaces.software//ical-generator/r/EN',
|
|
events: events.map(event => {
|
|
return {
|
|
start: event.start,
|
|
end: event.end,
|
|
summary: event.title,
|
|
description: ""
|
|
}
|
|
})
|
|
});
|
|
|
|
res.writeHead(200, {
|
|
'Content-Type': 'text/calendar; charset=utf-8',
|
|
'Content-Disposition': 'attachment; filename="calendar.ics"'
|
|
});
|
|
|
|
res.end(cal.toString());
|
|
} else {
|
|
res.sendStatus(404)
|
|
}
|
|
});
|
|
|
|
app.get("/email/listInboxes", async (req,res) => {
|
|
const client = new ImapFlow({
|
|
host: 'imap.strato.de',
|
|
port: 993,
|
|
secure: true,
|
|
auth: {
|
|
user: 'info@federspiel.tech',
|
|
pass: 'fpGUpbQG34'
|
|
},
|
|
logger: {}
|
|
});
|
|
|
|
await client.connect();
|
|
let tree = await client.listTree();
|
|
let folders = []
|
|
tree.folders.forEach(mailbox => folders.push(mailbox.path))
|
|
|
|
res.json(folders)
|
|
|
|
})
|
|
app.get("/email/listMessagesInInbox/:inbox", async (req,res) => {
|
|
const inbox = req.params.inbox
|
|
|
|
const client = new ImapFlow({
|
|
host: 'imap.strato.de',
|
|
port: 993,
|
|
secure: true,
|
|
auth: {
|
|
user: 'info@federspiel.tech',
|
|
pass: 'fpGUpbQG34'
|
|
},
|
|
logger: {}
|
|
});
|
|
|
|
await client.connect();
|
|
let messages = [];
|
|
let mailbox = await client.mailboxOpen(inbox);
|
|
|
|
for await (let message of client.fetch('1:*', { envelope: true })) {
|
|
console.log(`${message.uid}: ${message.envelope.subject}`);
|
|
messages.push(message)
|
|
//console.log(`${message.envelope}`);
|
|
}
|
|
console.log(messages)
|
|
let messagesString = JSON.stringify(messages, (key,value) => typeof value === 'bigint' ? value.toString() : value)
|
|
console.log(messagesString)
|
|
|
|
res.json(JSON.parse(messagesString))
|
|
|
|
})
|
|
|
|
app.get("/email/getContent/:inbox/:uid", async (req,res) => {
|
|
const inbox = req.params.inbox
|
|
const uid = req.params.uid
|
|
|
|
const client = new ImapFlow({
|
|
host: 'imap.strato.de',
|
|
port: 993,
|
|
secure: true,
|
|
auth: {
|
|
user: 'info@federspiel.tech',
|
|
pass: 'fpGUpbQG34'
|
|
},
|
|
logger: {}
|
|
});
|
|
|
|
await client.connect();
|
|
let mailbox = await client.mailboxOpen(inbox);
|
|
|
|
|
|
let data = await client.download(uid,'1.2');
|
|
//console.log(data)
|
|
|
|
function streamToString (stream) {
|
|
const chunks = [];
|
|
return new Promise((resolve, reject) => {
|
|
stream.on('data', (chunk) => chunks.push(Buffer.from(chunk)));
|
|
stream.on('error', (err) => reject(err));
|
|
stream.on('end', () => resolve(Buffer.concat(chunks).toString('utf8')));
|
|
})
|
|
}
|
|
|
|
const result = await streamToString(data.content)
|
|
|
|
res.send(result)
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
app.listen(3002); |