chore: Refactor file storage (#5711)
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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[]) {
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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 = {
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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({
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 = {
|
||||
|
||||
@@ -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 = {
|
||||
|
||||
Reference in New Issue
Block a user