immersive2/netlify/functions/users/users.mts
2023-11-06 05:48:22 -06:00

148 lines
4.3 KiB
TypeScript

import {Context} from "@netlify/functions";
import axios from 'axios';
const baseurl = 'https://syncdb-service-d3f974de56ef.herokuapp.com/';
const auth = 'admin:stM8Lnm@Cuf-tWZHv';
const authToken = Buffer.from(auth).toString('base64');
function buildOptions(req: Request) {
if (req.method == 'OPTIONS') {
return new Response(
new Blob(),
{
headers: {
'Allow': 'POST',
'Max-Age': '86400',
'Access-Control-Allow-Methods': 'POST',
'Access-Control-Allow-Origin': origin ? origin : 'https://cameras.immersiveidea.com',
'Access-Control-Allow-Credentials': 'true'
},
status: 200
})
} else {
return null;
}
}
type Params = {
username: string,
password: string
}
async function checkIfDbExists(params: Params) {
console.log("Checking if DB exists");
if (!params.username || !params.password) {
throw new Error('No share key provided');
}
try {
console.log('Checking for DB');
const exist = await axios.head(baseurl + params.username);
if (exist) {
return true;
}
} catch (err) {
console.log("DB not Found");
//console.log(err);
}
return false;
}
async function createDB(params: Params) {
console.log("Creating DB");
const response = await axios.put(
baseurl + params.username,
{},
{
headers: {
'Authorization': 'Basic ' + authToken,
'Content-Type': 'application/json',
'Accept': 'application/json'
}
});
console.log(response.status);
console.log(response.data);
return response;
}
async function createUser(params: Params) {
console.log("Creating User");
const userResponse = await axios.put(
baseurl + '_users/org.couchdb.user:' + params.username,
{
_id: 'org.couchdb.user:' + params.username,
name: params.username,
password: params.password, roles: [], type: 'user'
},
{
headers: {
'Authorization': 'Basic ' + authToken,
'Content-Type': 'application/json',
'Accept': 'application/json'
}
});
return userResponse;
}
async function authorizeUser(params: Params) {
console.log("Authorizing User");
return await axios.put(
baseurl + params.username + '/_security',
{admins: {names: [], roles: []}, members: {names: [params.username], roles: []}},
{
headers: {
'Authorization': 'Basic ' + authToken,
'Content-Type': 'application/json',
'Accept': 'application/json'
}
});
}
export default async (req: Request, context: Context) => {
console.log(req.method);
const origin = req.headers['origin'];
const options = buildOptions(req);
if (options) {
return options;
}
try {
const params = JSON.parse(await req.text());
console.log(params);
const exists = await checkIfDbExists(params);
if (exists) {
return new Response("OK");
}
const createDbResponse = await createDB(params);
if (createDbResponse.status != 201) {
throw new Error('Could not create DB');
}
const createUserResponse = await createUser(params);
if (createUserResponse.status != 201) {
throw new Error('Could not create User');
}
const authorizeUserResponse = await authorizeUser(params);
if (authorizeUserResponse.status != 200) {
throw new Error('could not authorize user');
}
return new Response(
"OK",
{
headers: {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': origin ? origin : 'https://cameras.immersiveidea.com',
'Access-Control-Allow-Credentials': 'true'
},
status: 200,
}
)
} catch (err) {
console.log(err);
const response = {err: err};
return new Response(JSON.stringify(response),
{status: 500}
)
}
}