Update the file helpers
This commit is contained in:
parent
a9f0a37020
commit
a20f6c88c9
@ -1,35 +1,83 @@
|
|||||||
|
import ffprobe from "ffprobe";
|
||||||
|
import ffprobeStatic from "ffprobe-static";
|
||||||
import path from "path";
|
import path from "path";
|
||||||
|
import UserModel from "src/models/UserModel";
|
||||||
import { FILE_STORAGE_LOCATION } from "../../consts/filePaths";
|
import { FILE_STORAGE_LOCATION } from "../../consts/filePaths";
|
||||||
import FileModel from "../../models/FileModel";
|
import FileModel from "../../models/FileModel";
|
||||||
import { createFileIO } from "./ioHelpers";
|
import { createFileIO, readFileIO } from "./ioHelpers";
|
||||||
import { connectMongo } from "./mongoHelpers";
|
import { connectMongo } from "./mongoHelpers";
|
||||||
import { randomString } from "./stringHelpers";
|
import { randomString } from "./stringHelpers";
|
||||||
|
|
||||||
connectMongo();
|
connectMongo();
|
||||||
|
|
||||||
|
const BASE_STORAGE = `${FILE_STORAGE_LOCATION}${path.sep}`;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the the files object in mongo for the given id
|
* Returns the the files object in mongo for the given id
|
||||||
*
|
*
|
||||||
* @param {string} fileId The files id
|
* @param {string} fileId The files id
|
||||||
|
* @param {boolean} isInternal If true, will return more data
|
||||||
* @return The file object or null if not found
|
* @return The file object or null if not found
|
||||||
*/
|
*/
|
||||||
export async function getFile(fileId) {
|
export async function getFileInfo(fileId, isInternal = false) {
|
||||||
return await FileModel.findOne({ fileId: fileId });
|
// Todo: Implement cache?
|
||||||
|
let file = await FileModel.aggregate([
|
||||||
|
{
|
||||||
|
$match: {
|
||||||
|
fileId: fileId,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
$lookup: {
|
||||||
|
from: UserModel.collection.name,
|
||||||
|
localField: "uploader",
|
||||||
|
foreignField: "_id",
|
||||||
|
as: "uploader",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
]).exec();
|
||||||
|
if (file.length < 1) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
file = file[0];
|
||||||
|
const uploader = file.uploader[0];
|
||||||
|
uploader._id = undefined;
|
||||||
|
if (!isInternal) {
|
||||||
|
uploader.uploadKey = undefined;
|
||||||
|
}
|
||||||
|
uploader.password = undefined;
|
||||||
|
uploader.salt = undefined;
|
||||||
|
uploader.lastLoginDate = undefined;
|
||||||
|
uploader.__v = undefined;
|
||||||
|
file.uploader = uploader;
|
||||||
|
file._id = undefined;
|
||||||
|
file.__v = undefined;
|
||||||
|
file.fileUrl = process.env.NEXT_PUBLIC_SITE_URL + "/api/files/" + file.fileId;
|
||||||
|
return file;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates the file object in mongo and stores it to the storage location
|
* Creates the file object in mongo and stores it to the storage location
|
||||||
*
|
*
|
||||||
* @param {UserModel} uploader The user who uploaded the file
|
* @param {UserModel} uploader The user who uploaded the file
|
||||||
* @param {[]} fileData The file data for the upload
|
* @param {string} fileName The original files name
|
||||||
|
* @param {Buffer} buffer The buffer of the file
|
||||||
|
* @param {string} contentType The content type of the file
|
||||||
|
* @param {Number} size The size of the file
|
||||||
*/
|
*/
|
||||||
export async function createFile(uploader, fileName, buffer, contentType) {
|
export async function createFile(
|
||||||
|
uploader,
|
||||||
|
fileName,
|
||||||
|
buffer,
|
||||||
|
contentType,
|
||||||
|
size
|
||||||
|
) {
|
||||||
const fileId = randomString(process.env.FILE_ID_LENGTH);
|
const fileId = randomString(process.env.FILE_ID_LENGTH);
|
||||||
const extention = fileName.split(".")[1].toLowerCase();
|
const extention = fileName.split(".").at(-1).toLowerCase();
|
||||||
// Todo: Check if the file was actually saved to
|
// Todo: Check if the file was actually saved to
|
||||||
// disk and create a return type so we can notify the user what happened
|
// disk and create a return type so we can notify the user what happened
|
||||||
await createFileIO(
|
await createFileIO(
|
||||||
`${FILE_STORAGE_LOCATION}${path.sep}${uploader.uploadKey}`,
|
`${BASE_STORAGE}${uploader.uploadKey}`,
|
||||||
`${fileId}.${extention}`,
|
`${fileId}.${extention}`,
|
||||||
buffer
|
buffer
|
||||||
);
|
);
|
||||||
@ -38,7 +86,32 @@ export async function createFile(uploader, fileName, buffer, contentType) {
|
|||||||
fileId: fileId,
|
fileId: fileId,
|
||||||
uploadDate: new Date(),
|
uploadDate: new Date(),
|
||||||
contentType: contentType,
|
contentType: contentType,
|
||||||
|
ext: extention,
|
||||||
|
size: size,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
contentType = contentType.toLowerCase();
|
||||||
|
if (contentType.includes("image") || contentType.includes("video")) {
|
||||||
|
const fileMetaData = await ffprobe(
|
||||||
|
`${BASE_STORAGE}${uploader.uploadKey}${path.sep}${fileId}.${extention}`,
|
||||||
|
{ path: ffprobeStatic.path }
|
||||||
|
);
|
||||||
|
const dimensions = fileMetaData.streams[0];
|
||||||
|
file.width = dimensions.width;
|
||||||
|
file.height = dimensions.height;
|
||||||
|
}
|
||||||
|
|
||||||
await file.save();
|
await file.save();
|
||||||
return `${fileId}.${extention}`;
|
return `${fileId}.${extention}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export async function getFileRaw(fileId) {
|
||||||
|
const fileInfo = await getFileInfo(fileId, true);
|
||||||
|
if (fileInfo == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const filePath = `${BASE_STORAGE}${fileInfo.uploader.uploadKey}${path.sep}${fileInfo.fileId}.${fileInfo.ext}`;
|
||||||
|
const buffer = await readFileIO(filePath);
|
||||||
|
return { file: fileInfo, buffer: buffer };
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user