Files
FEDEO/tools/comServer/index.mjs

315 lines
8.0 KiB
JavaScript

import ical, {ICalCalendarMethod} from 'ical-generator';
import express from "express"
import {createClient} from "@supabase/supabase-js";
import vCardsJS from "vcards-js"
import cors from 'cors'
import axios from "axios"
import basicAuth from "express-basic-auth"
const supabase = createClient(process.env.SUPABASE_URL,process.env.SUPABASE_SERVICE_ROLE_KEY)
const app = express();
app.use(cors())
app.use(basicAuth({
users: {
frontend: "Xt9Zn9RDSpdbr"
}
}))
/*
* TODO: Implement Auth for the Endpoints
*
*
* */
let goCardlessAccessToken = null
let goCardlessRefreshToken = null
const getGoCardlessToken = async () => {
const {data,error} = await axios({
url: "https://bankaccountdata.gocardless.com/api/v2/token/new/",
method: "POST",
data: {
secret_id: process.env.GOCARDLESS_SECRET_ID,
secret_key: process.env.GOCARDLESS_SECRET_KEY
}
})
if(error) throw error
console.log(data)
goCardlessRefreshToken = data.refresh
goCardlessAccessToken = data.access
}
/*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("/banking/token", async (req,res) => {
if(goCardlessAccessToken) {
res.json({
token: goCardlessAccessToken
})
} else {
await getGoCardlessToken()
res.json({
token: goCardlessAccessToken
})
}
})*/
app.get('/banking/institutions/:bic?', async (req,res) => {
const {data,error} = await axios({
url:"https://bankaccountdata.gocardless.com/api/v2/institutions/?country=de",
method: "GET",
headers: {
Authorization: `Bearer ${goCardlessAccessToken}`
}
})
console.log(error)
console.log(data)
if(req.params.bic) {
let bank = data.find(i => i.bic.toLowerCase() === req.params.bic.toLowerCase())
if(bank) {
res.json(bank)
} else {
res.sendStatus(404)
}
} else {
res.json(data)
}
})
app.post('/banking/link', async (req,res) => {
const institutionId = req.query.institution_id
const tenant = req.query.tenant
console.log(institutionId)
console.log(req.query)
const {data,error} = await axios({
url:"https://ob.gocardless.com/api/v2/requisitions/",
method: "POST",
headers: {
Authorization: `Bearer ${goCardlessAccessToken}`,
accept: "application/json"
},
data: {
redirect: "http://localhost:3000/banking",
institution_id: institutionId,
user_language: "de"
}
})
if(error) throw error
console.log(data)
console.log(error)
const {data: createAccountData, error: createAccountError} = await supabase
.from("bankrequisitions")
.insert({
tenant: tenant,
institutionId: institutionId,
id: data.id,
status: data.status
})
.select()
.single()
//if(createAccountError) throw createAccountError
console.log(createAccountData)
console.log(createAccountError)
res.json({
link: data.link
})
})
app.get("/banking/link/refresh", async (req,res) => {
const {data,error} = await supabase.from("bankrequisitions").select()
console.log(data)
console.log(error)
const {data: listReqData, error: listReqError} = await axios({
url:"https://ob.gocardless.com/api/v2/requisitions/",
method: "GET",
headers: {
Authorization: `Bearer ${goCardlessAccessToken}`,
accept: "application/json"
},
})
console.log(listReqData)
console.log(listReqError)
data.map(item => {
let gcItem = listReqData.results.find(i => i.id === item.id)
item.status = gcItem.status
return item
})
for(const item of data) {
const {data: updateReqData, error: updateReqError} = await supabase.from("bankrequisitions").update(item).eq("id",item.id)
console.log(updateReqData)
console.log(updateReqError)
}
res.sendStatus(200)
})
app.get("/banking/requisitions/:id?", async (req,res) => {
const {data: listReqData, error: listReqError} = await axios({
url:`https://ob.gocardless.com/api/v2/requisitions/${req.params.id ? req.params.id: ""}`,
method: "GET",
headers: {
Authorization: `Bearer ${goCardlessAccessToken}`,
accept: "application/json"
},
})
console.log(listReqData)
console.log(listReqError)
if(listReqData){
if(listReqData.accounts) {
let accounts = await Promise.all(listReqData.accounts.map(async (item) => {
const {data,error} = await axios({
url:"https://ob.gocardless.com/api/v2/accounts/" + item,
method: "GET",
headers: {
Authorization: `Bearer ${goCardlessAccessToken}`,
accept: "application/json"
},
})
console.log(data)
return data
}))
listReqData.accounts = accounts
}
res.json(listReqData)
} else {
res.sendStatus(404)
}
})
app.get("/banking/accounts/:id/:mode", async (req,res) => {
const {data: listAccData, error: listAccError} = await axios({
url:`https://ob.gocardless.com/api/v2/accounts/${req.params.id}/${req.params.mode}`,
method: "GET",
headers: {
Authorization: `Bearer ${goCardlessAccessToken}`,
accept: "application/json"
},
})
console.log(listAccData)
console.log(listAccError)
if(listAccData){
res.json(listAccData)
} else {
res.sendStatus(404)
}
})
if(!goCardlessAccessToken) {
getGoCardlessToken()
}
app.listen(3002);