Fix media code, clean up old types

This commit is contained in:
Jesse Wierzbinski 2024-03-10 13:57:26 -10:00
parent 852efaea50
commit 0e4d6b401c
No known key found for this signature in database
34 changed files with 137 additions and 1204 deletions

View file

@ -3,12 +3,16 @@ import { userRelations, userToAPI } from "~database/entities/User";
import { apiRoute, applyConfig } from "@api";
import { sanitize } from "isomorphic-dompurify";
import { sanitizeHtml } from "@sanitization";
import { uploadFile } from "~classes/media";
import ISO6391 from "iso-639-1";
import { parseEmojis } from "~database/entities/Emoji";
import { client } from "~database/datasource";
import type { APISource } from "~types/entities/source";
import { convertTextToHtml } from "@formatting";
import { MediaBackendType } from "media-manager";
import type { MediaBackend } from "media-manager";
import { LocalMediaBackend } from "~packages/media-manager/backends/local";
import { S3MediaBackend } from "~packages/media-manager/backends/s3";
import { getUrl } from "~database/entities/Attachment";
export const meta = applyConfig({
allowedMethods: ["PATCH"],
@ -69,6 +73,20 @@ export default apiRoute<{
};
}
let mediaManager: MediaBackend;
switch (config.media.backend as MediaBackendType) {
case MediaBackendType.LOCAL:
mediaManager = new LocalMediaBackend(config);
break;
case MediaBackendType.S3:
mediaManager = new S3MediaBackend(config);
break;
default:
// TODO: Replace with logger
throw new Error("Invalid media backend");
}
if (display_name) {
// Check if within allowed display name lengths
if (
@ -167,9 +185,9 @@ export default apiRoute<{
);
}
const hash = await uploadFile(avatar, config);
const { uploadedFile } = await mediaManager.addFile(avatar);
user.avatar = hash || "";
user.avatar = getUrl(uploadedFile.name, config);
}
if (header) {
@ -181,9 +199,9 @@ export default apiRoute<{
);
}
const hash = await uploadFile(header, config);
const { uploadedFile } = await mediaManager.addFile(header);
user.header = hash || "";
user.header = getUrl(uploadedFile.name, config);
}
if (locked) {

View file

@ -1,11 +1,13 @@
import { apiRoute, applyConfig } from "@api";
import { errorResponse, jsonResponse } from "@response";
import { client } from "~database/datasource";
import type { APIRouteMeta } from "~types/api";
import { uploadFile } from "~classes/media";
import { attachmentToAPI, getUrl } from "~database/entities/Attachment";
import type { MediaBackend } from "media-manager";
import { MediaBackendType } from "media-manager";
import { LocalMediaBackend } from "~packages/media-manager/backends/local";
import { S3MediaBackend } from "~packages/media-manager/backends/s3";
export const meta: APIRouteMeta = applyConfig({
export const meta = applyConfig({
allowedMethods: ["GET", "PUT"],
ratelimits: {
max: 10,
@ -61,13 +63,23 @@ export default apiRoute<{
let thumbnailUrl = attachment.thumbnail_url;
if (thumbnail) {
const hash = await uploadFile(
thumbnail as unknown as File,
config
);
let mediaManager: MediaBackend;
thumbnailUrl = hash ? getUrl(hash, config) : "";
switch (config.media.backend as MediaBackendType) {
case MediaBackendType.LOCAL:
mediaManager = new LocalMediaBackend(config);
break;
case MediaBackendType.S3:
mediaManager = new S3MediaBackend(config);
break;
default:
// TODO: Replace with logger
throw new Error("Invalid media backend");
}
if (thumbnail) {
const { uploadedFile } = await mediaManager.addFile(thumbnail);
thumbnailUrl = getUrl(uploadedFile.name, config);
}
const descriptionText = description || attachment.description;

View file

@ -2,12 +2,14 @@ import { apiRoute, applyConfig } from "@api";
import { errorResponse, jsonResponse } from "@response";
import { client } from "~database/datasource";
import { encode } from "blurhash";
import type { APIRouteMeta } from "~types/api";
import sharp from "sharp";
import { uploadFile } from "~classes/media";
import { attachmentToAPI, getUrl } from "~database/entities/Attachment";
import { MediaBackendType } from "media-manager";
import type { MediaBackend } from "media-manager";
import { LocalMediaBackend } from "~packages/media-manager/backends/local";
import { S3MediaBackend } from "~packages/media-manager/backends/s3";
export const meta: APIRouteMeta = applyConfig({
export const meta = applyConfig({
allowedMethods: ["POST"],
ratelimits: {
max: 10,
@ -88,16 +90,30 @@ export default apiRoute<{
let url = "";
const hash = await uploadFile(file, config);
let mediaManager: MediaBackend;
url = hash ? getUrl(hash, config) : "";
switch (config.media.backend as MediaBackendType) {
case MediaBackendType.LOCAL:
mediaManager = new LocalMediaBackend(config);
break;
case MediaBackendType.S3:
mediaManager = new S3MediaBackend(config);
break;
default:
// TODO: Replace with logger
throw new Error("Invalid media backend");
}
const { uploadedFile } = await mediaManager.addFile(file);
url = getUrl(uploadedFile.name, config);
let thumbnailUrl = "";
if (thumbnail) {
const hash = await uploadFile(thumbnail as unknown as File, config);
const { uploadedFile } = await mediaManager.addFile(thumbnail);
thumbnailUrl = hash ? getUrl(hash, config) : "";
thumbnailUrl = getUrl(uploadedFile.name, config);
}
const newAttachment = await client.attachment.create({

View file

@ -2,9 +2,8 @@ import { apiRoute, applyConfig } from "@api";
import { errorResponse, jsonResponse } from "@response";
import { client } from "~database/datasource";
import { userRelations, userToAPI } from "~database/entities/User";
import type { APIRouteMeta } from "~types/api";
export const meta: APIRouteMeta = applyConfig({
export const meta = applyConfig({
allowedMethods: ["DELETE"],
ratelimits: {
max: 10,

View file

@ -2,9 +2,8 @@ import { apiRoute, applyConfig } from "@api";
import { errorResponse, jsonResponse } from "@response";
import { client } from "~database/datasource";
import { userRelations, userToAPI } from "~database/entities/User";
import type { APIRouteMeta } from "~types/api";
export const meta: APIRouteMeta = applyConfig({
export const meta = applyConfig({
allowedMethods: ["DELETE"],
ratelimits: {
max: 10,

View file

@ -7,9 +7,8 @@ import {
statusAndUserRelations,
statusToAPI,
} from "~database/entities/Status";
import type { APIRouteMeta } from "~types/api";
export const meta: APIRouteMeta = applyConfig({
export const meta = applyConfig({
allowedMethods: ["GET"],
ratelimits: {
max: 8,

View file

@ -8,10 +8,9 @@ import {
statusAndUserRelations,
statusToAPI,
} from "~database/entities/Status";
import type { APIRouteMeta } from "~types/api";
import type { APIStatus } from "~types/entities/status";
export const meta: APIRouteMeta = applyConfig({
export const meta = applyConfig({
allowedMethods: ["POST"],
ratelimits: {
max: 100,

View file

@ -6,9 +6,8 @@ import {
statusAndUserRelations,
} from "~database/entities/Status";
import { userRelations, userToAPI } from "~database/entities/User";
import type { APIRouteMeta } from "~types/api";
export const meta: APIRouteMeta = applyConfig({
export const meta = applyConfig({
allowedMethods: ["GET"],
ratelimits: {
max: 100,

View file

@ -9,9 +9,8 @@ import {
statusAndUserRelations,
statusToAPI,
} from "~database/entities/Status";
import type { APIRouteMeta } from "~types/api";
export const meta: APIRouteMeta = applyConfig({
export const meta = applyConfig({
allowedMethods: ["GET", "DELETE", "PUT"],
ratelimits: {
max: 100,

View file

@ -3,9 +3,8 @@ import { apiRoute, applyConfig } from "@api";
import { errorResponse, jsonResponse } from "@response";
import { client } from "~database/datasource";
import { statusAndUserRelations, statusToAPI } from "~database/entities/Status";
import type { APIRouteMeta } from "~types/api";
export const meta: APIRouteMeta = applyConfig({
export const meta = applyConfig({
allowedMethods: ["POST"],
ratelimits: {
max: 100,

View file

@ -8,9 +8,8 @@ import {
statusToAPI,
} from "~database/entities/Status";
import { type UserWithRelations } from "~database/entities/User";
import type { APIRouteMeta } from "~types/api";
export const meta: APIRouteMeta = applyConfig({
export const meta = applyConfig({
allowedMethods: ["POST"],
ratelimits: {
max: 100,

View file

@ -6,9 +6,8 @@ import {
statusAndUserRelations,
} from "~database/entities/Status";
import { userRelations, userToAPI } from "~database/entities/User";
import type { APIRouteMeta } from "~types/api";
export const meta: APIRouteMeta = applyConfig({
export const meta = applyConfig({
allowedMethods: ["GET"],
ratelimits: {
max: 100,

View file

@ -5,9 +5,8 @@ import {
isViewableByUser,
statusAndUserRelations,
} from "~database/entities/Status";
import type { APIRouteMeta } from "~types/api";
export const meta: APIRouteMeta = applyConfig({
export const meta = applyConfig({
allowedMethods: ["GET"],
ratelimits: {
max: 100,

View file

@ -8,10 +8,9 @@ import {
statusAndUserRelations,
statusToAPI,
} from "~database/entities/Status";
import type { APIRouteMeta } from "~types/api";
import type { APIStatus } from "~types/entities/status";
export const meta: APIRouteMeta = applyConfig({
export const meta = applyConfig({
allowedMethods: ["POST"],
ratelimits: {
max: 100,

View file

@ -2,9 +2,8 @@ import { apiRoute, applyConfig } from "@api";
import { errorResponse, jsonResponse } from "@response";
import { client } from "~database/datasource";
import { statusAndUserRelations, statusToAPI } from "~database/entities/Status";
import type { APIRouteMeta } from "~types/api";
export const meta: APIRouteMeta = applyConfig({
export const meta = applyConfig({
allowedMethods: ["POST"],
ratelimits: {
max: 100,

View file

@ -6,10 +6,9 @@ import {
statusAndUserRelations,
statusToAPI,
} from "~database/entities/Status";
import type { APIRouteMeta } from "~types/api";
import type { APIStatus } from "~types/entities/status";
export const meta: APIRouteMeta = applyConfig({
export const meta = applyConfig({
allowedMethods: ["POST"],
ratelimits: {
max: 100,

View file

@ -11,9 +11,8 @@ import {
statusToAPI,
} from "~database/entities/Status";
import type { UserWithRelations } from "~database/entities/User";
import type { APIRouteMeta } from "~types/api";
export const meta: APIRouteMeta = applyConfig({
export const meta = applyConfig({
allowedMethods: ["POST"],
ratelimits: {
max: 300,

View file

@ -2,9 +2,8 @@ import { apiRoute, applyConfig } from "@api";
import { errorResponse, jsonResponse } from "@response";
import { client } from "~database/datasource";
import { statusAndUserRelations, statusToAPI } from "~database/entities/Status";
import type { APIRouteMeta } from "~types/api";
export const meta: APIRouteMeta = applyConfig({
export const meta = applyConfig({
allowedMethods: ["GET"],
ratelimits: {
max: 200,

View file

@ -2,9 +2,8 @@ import { apiRoute, applyConfig } from "@api";
import { errorResponse, jsonResponse } from "@response";
import { client } from "~database/datasource";
import { statusAndUserRelations, statusToAPI } from "~database/entities/Status";
import type { APIRouteMeta } from "~types/api";
export const meta: APIRouteMeta = applyConfig({
export const meta = applyConfig({
allowedMethods: ["GET"],
ratelimits: {
max: 200,

View file

@ -2,12 +2,14 @@ import { apiRoute, applyConfig } from "@api";
import { errorResponse, jsonResponse } from "@response";
import { client } from "~database/datasource";
import { encode } from "blurhash";
import type { APIRouteMeta } from "~types/api";
import sharp from "sharp";
import { uploadFile } from "~classes/media";
import { attachmentToAPI, getUrl } from "~database/entities/Attachment";
import type { MediaBackend } from "media-manager";
import { MediaBackendType } from "media-manager";
import { LocalMediaBackend } from "~packages/media-manager/backends/local";
import { S3MediaBackend } from "~packages/media-manager/backends/s3";
export const meta: APIRouteMeta = applyConfig({
export const meta = applyConfig({
allowedMethods: ["POST"],
ratelimits: {
max: 10,
@ -88,18 +90,32 @@ export default apiRoute<{
let url = "";
if (isImage) {
const hash = await uploadFile(file, config);
let mediaManager: MediaBackend;
url = hash ? getUrl(hash, config) : "";
switch (config.media.backend as MediaBackendType) {
case MediaBackendType.LOCAL:
mediaManager = new LocalMediaBackend(config);
break;
case MediaBackendType.S3:
mediaManager = new S3MediaBackend(config);
break;
default:
// TODO: Replace with logger
throw new Error("Invalid media backend");
}
if (isImage) {
const { uploadedFile } = await mediaManager.addFile(file);
url = getUrl(uploadedFile.name, config);
}
let thumbnailUrl = "";
if (thumbnail) {
const hash = await uploadFile(thumbnail as unknown as File, config);
const { uploadedFile } = await mediaManager.addFile(thumbnail);
thumbnailUrl = hash ? getUrl(hash, config) : "";
thumbnailUrl = getUrl(uploadedFile.name, config);
}
const newAttachment = await client.attachment.create({

View file

@ -4,9 +4,8 @@ import { errorResponse, jsonResponse } from "@response";
import { client } from "~database/datasource";
import { statusAndUserRelations, statusToAPI } from "~database/entities/Status";
import { userRelations, userToAPI } from "~database/entities/User";
import type { APIRouteMeta } from "~types/api";
export const meta: APIRouteMeta = applyConfig({
export const meta = applyConfig({
allowedMethods: ["GET"],
ratelimits: {
max: 10,