xcs/src/pages/api/v1/locations/[locationId]/starter-pack.ts

120 lines
3.2 KiB
TypeScript

import { tokenToID } from '@/pages/api/firebase';
import fs from 'fs';
import { generateApiKey } from 'generate-api-key';
import { NextApiRequest, NextApiResponse } from 'next';
import path from 'path';
import clientPromise from '@/lib/mongodb';
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
// Location ID
const { locationId } = req.query as { locationId: string };
// Authorization Header
const authHeader = req.headers.authorization;
// Bearer Token
const token = authHeader?.split(' ')[1];
// Verify Token
const uid = await tokenToID(token as string);
if (!uid) {
return res.status(401).json({ message: 'Unauthorized.' });
}
const mongoClient = await clientPromise;
const db = mongoClient.db(process.env.MONGODB_DB as string);
const locations = db.collection('locations');
const organizations = db.collection('organizations');
let location = (await locations.findOne({ id: locationId })) as any;
if (!location) {
return res.status(404).json({ message: 'Location not found' });
}
let organization = await organizations.findOne({
id: location.organizationId
});
if (!organization) {
return res.status(404).json({ message: 'Organization not found' });
}
if (!organization.members[uid as any]) {
return res.status(401).json({ message: 'Unauthorized.' });
}
if (req.method === 'GET') {
// Prepare file
const filePath = path.join(process.cwd(), 'wyre-starter.rbxmx');
let buffer = fs.readFileSync(filePath);
// Check if API Key already exists for this location that hasn't been used yet
let apiKey = Object.keys(organization.apiKeys).find(
(key) => organization?.apiKeys[key].locationId === locationId && organization.apiKeys[key].lastUsedAt === null
);
// If not, generate a new one
if (!apiKey) {
apiKey = generateApiKey({
method: 'uuidv4',
dashes: false
}) as string;
}
console.log(apiKey);
// Modify file content before sending
buffer = Buffer.from(
buffer
.toString()
.replace('{{locationId}}', location.id)
.replace('{{locationName}}', location.name)
.replace('{{configUrl}}', `${process.env.NEXT_PUBLIC_ROOT_URL}/locations/${location.id}`)
.replace('{{apiKey}}', apiKey)
);
const timestamp = new Date();
// Add API Key to database
await organizations.updateOne(
{ id: organization.id },
{
$set: {
[`apiKeys.${apiKey}`]: {
author: uid,
locationId: locationId,
createdAt: timestamp,
lastUsedAt: null
}
}
}
);
// Log
await organizations.updateOne(
{ id: organization.id },
{
$push: {
logs: {
type: 'api-key-generated',
performer: uid,
timestamp: timestamp,
locationId: locationId
}
}
}
);
// Send file
res.writeHead(200, {
'Content-Type': 'application/octet-stream',
'Content-Length': buffer.length
});
res.write(buffer);
return res.status(200).end();
}
return res.status(500).json({ message: 'An unknown error has occurred.' });
}