chore: Refactor file storage (#5711)

This commit is contained in:
Tom Moor
2023-08-20 10:04:34 -04:00
committed by GitHub
parent 4354e1055e
commit 74722b80f2
68 changed files with 496 additions and 313 deletions

View File

@@ -1,7 +1,7 @@
import { Transaction } from "sequelize";
import { v4 as uuidv4 } from "uuid";
import { Attachment, Event, User } from "@server/models";
import { uploadToS3 } from "@server/utils/s3";
import FileStorage from "@server/storage/files";
export default async function attachmentCreator({
id,
@@ -24,7 +24,7 @@ export default async function attachmentCreator({
}) {
const key = `uploads/${user.id}/${uuidv4()}/${name}`;
const acl = process.env.AWS_S3_ACL || "private";
const url = await uploadToS3({
const url = await FileStorage.upload({
body: buffer,
contentType: type,
contentLength: buffer.length,

View File

@@ -1,4 +1,5 @@
import { Transaction } from "sequelize";
import { v4 as uuidv4 } from "uuid";
import {
FileOperationFormat,
FileOperationType,
@@ -6,7 +7,6 @@ import {
} from "@shared/types";
import { traceFunction } from "@server/logging/tracing";
import { Collection, Event, Team, User, FileOperation } from "@server/models";
import { getAWSKeyForFileOp } from "@server/utils/s3";
type Props = {
collection?: Collection;
@@ -18,6 +18,11 @@ type Props = {
transaction: Transaction;
};
function getKeyForFileOp(teamId: string, name: string) {
const bucket = "uploads";
return `${bucket}/${teamId}/${uuidv4()}/${name}-export.zip`;
}
async function collectionExporter({
collection,
team,
@@ -28,7 +33,7 @@ async function collectionExporter({
transaction,
}: Props) {
const collectionId = collection?.id;
const key = getAWSKeyForFileOp(user.teamId, collection?.name || team.name);
const key = getKeyForFileOp(user.teamId, collection?.name || team.name);
const fileOperation = await FileOperation.create(
{
type: FileOperationType.Export,

View File

@@ -2,10 +2,10 @@ import { yDocToProsemirrorJSON } from "@getoutline/y-prosemirror";
import uniq from "lodash/uniq";
import { Node } from "prosemirror-model";
import * as Y from "yjs";
import { sequelize } from "@server/database/sequelize";
import { schema, serializer } from "@server/editor";
import Logger from "@server/logging/Logger";
import { Document, Event } from "@server/models";
import { sequelize } from "@server/storage/database";
type Props = {
/** The document ID to update */

View File

@@ -5,7 +5,7 @@ import { buildUser } from "@server/test/factories";
import { setupTestDatabase } from "@server/test/support";
import documentImporter from "./documentImporter";
jest.mock("../utils/s3");
jest.mock("@server/storage/files");
setupTestDatabase();

View File

@@ -1,5 +1,5 @@
import { sequelize } from "@server/database/sequelize";
import Pin from "@server/models/Pin";
import { sequelize } from "@server/storage/database";
import { buildDocument, buildCollection } from "@server/test/factories";
import { setupTestDatabase, seed } from "@server/test/support";
import documentMover from "./documentMover";

View File

@@ -1,9 +1,9 @@
import uniq from "lodash/uniq";
import { QueryTypes } from "sequelize";
import { sequelize } from "@server/database/sequelize";
import Logger from "@server/logging/Logger";
import { Document, Attachment } from "@server/models";
import DeleteAttachmentTask from "@server/queues/tasks/DeleteAttachmentTask";
import { sequelize } from "@server/storage/database";
import parseAttachmentIds from "@server/utils/parseAttachmentIds";
export default async function documentPermanentDeleter(documents: Document[]) {

View File

@@ -1,5 +1,5 @@
import { sequelize } from "@server/database/sequelize";
import { Event } from "@server/models";
import { sequelize } from "@server/storage/database";
import { buildDocument, buildUser } from "@server/test/factories";
import { setupTestDatabase } from "@server/test/support";
import documentUpdater from "./documentUpdater";

View File

@@ -1,5 +1,5 @@
import { sequelize } from "@server/database/sequelize";
import { FileOperation, Event, User } from "@server/models";
import { sequelize } from "@server/storage/database";
export default async function fileOperationDeleter(
fileOperation: FileOperation,

View File

@@ -1,6 +1,6 @@
import { NotificationEventType } from "@shared/types";
import { sequelize } from "@server/database/sequelize";
import { Event } from "@server/models";
import { sequelize } from "@server/storage/database";
import {
buildUser,
buildNotification,

View File

@@ -1,9 +1,9 @@
import fractionalIndex from "fractional-index";
import { Sequelize, Op, WhereOptions } from "sequelize";
import { PinValidation } from "@shared/validations";
import { sequelize } from "@server/database/sequelize";
import { ValidationError } from "@server/errors";
import { Pin, User, Event } from "@server/models";
import { sequelize } from "@server/storage/database";
type Props = {
/** The user creating the pin */

View File

@@ -1,5 +1,5 @@
import { sequelize } from "@server/database/sequelize";
import { Event, Pin, User } from "@server/models";
import { sequelize } from "@server/storage/database";
type Props = {
/** The user updating the pin */

View File

@@ -1,5 +1,5 @@
import { sequelize } from "@server/database/sequelize";
import { Document, User, Event, Revision } from "@server/models";
import { sequelize } from "@server/storage/database";
export default async function revisionCreator({
document,

View File

@@ -1,5 +1,5 @@
import { sequelize } from "@server/database/sequelize";
import { Star, Event } from "@server/models";
import { sequelize } from "@server/storage/database";
import { buildDocument, buildUser } from "@server/test/factories";
import { setupTestDatabase } from "@server/test/support";
import starCreator from "./starCreator";

View File

@@ -1,6 +1,6 @@
import { Transaction } from "sequelize";
import { sequelize } from "@server/database/sequelize";
import { Event, Star, User } from "@server/models";
import { sequelize } from "@server/storage/database";
type Props = {
/** The user destroying the star */

View File

@@ -1,5 +1,5 @@
import { sequelize } from "@server/database/sequelize";
import { Event, Star, User } from "@server/models";
import { sequelize } from "@server/storage/database";
type Props = {
/** The user updating the star */

View File

@@ -1,5 +1,5 @@
import { sequelize } from "@server/database/sequelize";
import { Subscription, Event } from "@server/models";
import { sequelize } from "@server/storage/database";
import { buildDocument, buildUser } from "@server/test/factories";
import { setupTestDatabase } from "@server/test/support";
import subscriptionCreator from "./subscriptionCreator";

View File

@@ -1,6 +1,6 @@
import { Transaction } from "sequelize";
import { sequelize } from "@server/database/sequelize";
import { Subscription, Event, User, Document } from "@server/models";
import { sequelize } from "@server/storage/database";
import { DocumentEvent, RevisionEvent } from "@server/types";
type Props = {

View File

@@ -1,5 +1,5 @@
import { sequelize } from "@server/database/sequelize";
import { Subscription, Event } from "@server/models";
import { sequelize } from "@server/storage/database";
import {
buildDocument,
buildSubscription,

View File

@@ -1,5 +1,4 @@
import { Transaction } from "sequelize";
import { sequelize } from "@server/database/sequelize";
import Logger from "@server/logging/Logger";
import { traceFunction } from "@server/logging/tracing";
import {
@@ -19,6 +18,7 @@ import {
SearchQuery,
Share,
} from "@server/models";
import { sequelize } from "@server/storage/database";
async function teamPermanentDeleter(team: Team) {
if (!team.deletedAt) {

View File

@@ -1,5 +1,4 @@
import teamCreator from "@server/commands/teamCreator";
import { sequelize } from "@server/database/sequelize";
import env from "@server/env";
import {
DomainNotAllowedError,
@@ -8,6 +7,7 @@ import {
} from "@server/errors";
import { traceFunction } from "@server/logging/tracing";
import { Team, AuthenticationProvider } from "@server/models";
import { sequelize } from "@server/storage/database";
type TeamProvisionerResult = {
team: Team;

View File

@@ -1,8 +1,8 @@
import { sequelize } from "@server/database/sequelize";
import { ValidationError } from "@server/errors";
import { Event, User } from "@server/models";
import type { UserRole } from "@server/models/User";
import CleanupDemotedUserTask from "@server/queues/tasks/CleanupDemotedUserTask";
import { sequelize } from "@server/storage/database";
type Props = {
user: User;

View File

@@ -1,6 +1,6 @@
import { Op } from "sequelize";
import { sequelize } from "@server/database/sequelize";
import { Event, User } from "@server/models";
import { sequelize } from "@server/storage/database";
import { ValidationError } from "../errors";
export default async function userDestroyer({

View File

@@ -1,4 +1,3 @@
import { sequelize } from "@server/database/sequelize";
import InviteAcceptedEmail from "@server/emails/templates/InviteAcceptedEmail";
import {
DomainNotAllowedError,
@@ -6,6 +5,7 @@ import {
InviteRequiredError,
} from "@server/errors";
import { Event, Team, User, UserAuthentication } from "@server/models";
import { sequelize } from "@server/storage/database";
type UserProvisionerResult = {
user: User;

View File

@@ -1,7 +1,7 @@
import { Transaction } from "sequelize";
import { sequelize } from "@server/database/sequelize";
import { User, Event, GroupUser } from "@server/models";
import CleanupDemotedUserTask from "@server/queues/tasks/CleanupDemotedUserTask";
import { sequelize } from "@server/storage/database";
import { ValidationError } from "../errors";
type Props = {

View File

@@ -1,6 +1,6 @@
import { Transaction } from "sequelize";
import { sequelize } from "@server/database/sequelize";
import { User, Event } from "@server/models";
import { sequelize } from "@server/storage/database";
import { ValidationError } from "../errors";
type Props = {