This commit implements the core admin dashboard functionality including NextAuth authentication, Cloudflare D1 database integration with complete schema, and Cloudflare R2 file upload system for portfolio images. Features include artist management, appointment scheduling, and data migration capabilities.
58 lines
1.5 KiB
JavaScript
58 lines
1.5 KiB
JavaScript
'use strict';
|
|
|
|
const { parseContentType } = require('./utils.js');
|
|
|
|
function getInstance(cfg) {
|
|
const headers = cfg.headers;
|
|
const conType = parseContentType(headers['content-type']);
|
|
if (!conType)
|
|
throw new Error('Malformed content type');
|
|
|
|
for (const type of TYPES) {
|
|
const matched = type.detect(conType);
|
|
if (!matched)
|
|
continue;
|
|
|
|
const instanceCfg = {
|
|
limits: cfg.limits,
|
|
headers,
|
|
conType,
|
|
highWaterMark: undefined,
|
|
fileHwm: undefined,
|
|
defCharset: undefined,
|
|
defParamCharset: undefined,
|
|
preservePath: false,
|
|
};
|
|
if (cfg.highWaterMark)
|
|
instanceCfg.highWaterMark = cfg.highWaterMark;
|
|
if (cfg.fileHwm)
|
|
instanceCfg.fileHwm = cfg.fileHwm;
|
|
instanceCfg.defCharset = cfg.defCharset;
|
|
instanceCfg.defParamCharset = cfg.defParamCharset;
|
|
instanceCfg.preservePath = cfg.preservePath;
|
|
return new type(instanceCfg);
|
|
}
|
|
|
|
throw new Error(`Unsupported content type: ${headers['content-type']}`);
|
|
}
|
|
|
|
// Note: types are explicitly listed here for easier bundling
|
|
// See: https://github.com/mscdex/busboy/issues/121
|
|
const TYPES = [
|
|
require('./types/multipart'),
|
|
require('./types/urlencoded'),
|
|
].filter(function(typemod) { return typeof typemod.detect === 'function'; });
|
|
|
|
module.exports = (cfg) => {
|
|
if (typeof cfg !== 'object' || cfg === null)
|
|
cfg = {};
|
|
|
|
if (typeof cfg.headers !== 'object'
|
|
|| cfg.headers === null
|
|
|| typeof cfg.headers['content-type'] !== 'string') {
|
|
throw new Error('Missing Content-Type');
|
|
}
|
|
|
|
return getInstance(cfg);
|
|
};
|