summaryrefslogtreecommitdiff
path: root/packages/backend/src/server/api/endpoints/admin/drive
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2023-01-16 15:21:43 +0900
committersyuilo <Syuilotan@yahoo.co.jp>2023-01-16 15:21:43 +0900
commitd56fc4186529bf41fe840cb3497f1a363ac84475 (patch)
treee4da77fc7544fb8d5619e9799ee9ce3494ccd80b /packages/backend/src/server/api/endpoints/admin/drive
parentmasterブランチをmaster_securityとマージ (#9260) (diff)
parent13.0.0 (diff)
downloadmisskey-d56fc4186529bf41fe840cb3497f1a363ac84475.tar.gz
misskey-d56fc4186529bf41fe840cb3497f1a363ac84475.tar.bz2
misskey-d56fc4186529bf41fe840cb3497f1a363ac84475.zip
Merge branch 'develop'
Diffstat (limited to 'packages/backend/src/server/api/endpoints/admin/drive')
-rw-r--r--packages/backend/src/server/api/endpoints/admin/drive/clean-remote-files.ts18
-rw-r--r--packages/backend/src/server/api/endpoints/admin/drive/cleanup.ts32
-rw-r--r--packages/backend/src/server/api/endpoints/admin/drive/files.ts70
-rw-r--r--packages/backend/src/server/api/endpoints/admin/drive/show-file.ts104
4 files changed, 140 insertions, 84 deletions
diff --git a/packages/backend/src/server/api/endpoints/admin/drive/clean-remote-files.ts b/packages/backend/src/server/api/endpoints/admin/drive/clean-remote-files.ts
index bab149532e..2cc4e70e55 100644
--- a/packages/backend/src/server/api/endpoints/admin/drive/clean-remote-files.ts
+++ b/packages/backend/src/server/api/endpoints/admin/drive/clean-remote-files.ts
@@ -1,5 +1,6 @@
-import define from '../../../define.js';
-import { createCleanRemoteFilesJob } from '@/queue/index.js';
+import { Inject, Injectable } from '@nestjs/common';
+import { Endpoint } from '@/server/api/endpoint-base.js';
+import { QueueService } from '@/core/QueueService.js';
export const meta = {
tags: ['admin'],
@@ -15,6 +16,13 @@ export const paramDef = {
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, paramDef, async (ps, me) => {
- createCleanRemoteFilesJob();
-});
+@Injectable()
+export default class extends Endpoint<typeof meta, typeof paramDef> {
+ constructor(
+ private queueService: QueueService,
+ ) {
+ super(meta, paramDef, async (ps, me) => {
+ this.queueService.createCleanRemoteFilesJob();
+ });
+ }
+}
diff --git a/packages/backend/src/server/api/endpoints/admin/drive/cleanup.ts b/packages/backend/src/server/api/endpoints/admin/drive/cleanup.ts
index 3db942e6cd..4f7e02fe92 100644
--- a/packages/backend/src/server/api/endpoints/admin/drive/cleanup.ts
+++ b/packages/backend/src/server/api/endpoints/admin/drive/cleanup.ts
@@ -1,7 +1,9 @@
import { IsNull } from 'typeorm';
-import define from '../../../define.js';
-import { deleteFile } from '@/services/drive/delete-file.js';
-import { DriveFiles } from '@/models/index.js';
+import { Inject, Injectable } from '@nestjs/common';
+import { Endpoint } from '@/server/api/endpoint-base.js';
+import type { DriveFilesRepository } from '@/models/index.js';
+import { DriveService } from '@/core/DriveService.js';
+import { DI } from '@/di-symbols.js';
export const meta = {
tags: ['admin'],
@@ -17,12 +19,22 @@ export const paramDef = {
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, paramDef, async (ps, me) => {
- const files = await DriveFiles.findBy({
- userId: IsNull(),
- });
+@Injectable()
+export default class extends Endpoint<typeof meta, typeof paramDef> {
+ constructor(
+ @Inject(DI.driveFilesRepository)
+ private driveFilesRepository: DriveFilesRepository,
- for (const file of files) {
- deleteFile(file);
+ private driveService: DriveService,
+ ) {
+ super(meta, paramDef, async (ps, me) => {
+ const files = await this.driveFilesRepository.findBy({
+ userId: IsNull(),
+ });
+
+ for (const file of files) {
+ this.driveService.deleteFile(file);
+ }
+ });
}
-});
+}
diff --git a/packages/backend/src/server/api/endpoints/admin/drive/files.ts b/packages/backend/src/server/api/endpoints/admin/drive/files.ts
index ba32aac431..8a4498d5fa 100644
--- a/packages/backend/src/server/api/endpoints/admin/drive/files.ts
+++ b/packages/backend/src/server/api/endpoints/admin/drive/files.ts
@@ -1,11 +1,14 @@
-import { DriveFiles } from '@/models/index.js';
-import define from '../../../define.js';
-import { makePaginationQuery } from '../../../common/make-pagination-query.js';
+import { Inject, Injectable } from '@nestjs/common';
+import type { DriveFilesRepository } from '@/models/index.js';
+import { Endpoint } from '@/server/api/endpoint-base.js';
+import { QueryService } from '@/core/QueryService.js';
+import { DI } from '@/di-symbols.js';
+import { DriveFileEntityService } from '@/core/entities/DriveFileEntityService.js';
export const meta = {
tags: ['admin'],
- requireCredential: false,
+ requireCredential: true,
requireModerator: true,
res: {
@@ -39,32 +42,43 @@ export const paramDef = {
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, paramDef, async (ps, me) => {
- const query = makePaginationQuery(DriveFiles.createQueryBuilder('file'), ps.sinceId, ps.untilId);
+@Injectable()
+export default class extends Endpoint<typeof meta, typeof paramDef> {
+ constructor(
+ @Inject(DI.driveFilesRepository)
+ private driveFilesRepository: DriveFilesRepository,
- if (ps.userId) {
- query.andWhere('file.userId = :userId', { userId: ps.userId });
- } else {
- if (ps.origin === 'local') {
- query.andWhere('file.userHost IS NULL');
- } else if (ps.origin === 'remote') {
- query.andWhere('file.userHost IS NOT NULL');
- }
+ private driveFileEntityService: DriveFileEntityService,
+ private queryService: QueryService,
+ ) {
+ super(meta, paramDef, async (ps, me) => {
+ const query = this.queryService.makePaginationQuery(this.driveFilesRepository.createQueryBuilder('file'), ps.sinceId, ps.untilId);
- if (ps.hostname) {
- query.andWhere('file.userHost = :hostname', { hostname: ps.hostname });
- }
- }
+ if (ps.userId) {
+ query.andWhere('file.userId = :userId', { userId: ps.userId });
+ } else {
+ if (ps.origin === 'local') {
+ query.andWhere('file.userHost IS NULL');
+ } else if (ps.origin === 'remote') {
+ query.andWhere('file.userHost IS NOT NULL');
+ }
- if (ps.type) {
- if (ps.type.endsWith('/*')) {
- query.andWhere('file.type like :type', { type: ps.type.replace('/*', '/') + '%' });
- } else {
- query.andWhere('file.type = :type', { type: ps.type });
- }
- }
+ if (ps.hostname) {
+ query.andWhere('file.userHost = :hostname', { hostname: ps.hostname });
+ }
+ }
- const files = await query.take(ps.limit).getMany();
+ if (ps.type) {
+ if (ps.type.endsWith('/*')) {
+ query.andWhere('file.type like :type', { type: ps.type.replace('/*', '/') + '%' });
+ } else {
+ query.andWhere('file.type = :type', { type: ps.type });
+ }
+ }
- return await DriveFiles.packMany(files, { detail: true, withUser: true, self: true });
-});
+ const files = await query.take(ps.limit).getMany();
+
+ return await this.driveFileEntityService.packMany(files, { detail: true, withUser: true, self: true });
+ });
+ }
+}
diff --git a/packages/backend/src/server/api/endpoints/admin/drive/show-file.ts b/packages/backend/src/server/api/endpoints/admin/drive/show-file.ts
index e9117a23c8..6376cb153c 100644
--- a/packages/backend/src/server/api/endpoints/admin/drive/show-file.ts
+++ b/packages/backend/src/server/api/endpoints/admin/drive/show-file.ts
@@ -1,5 +1,8 @@
-import { DriveFiles } from '@/models/index.js';
-import define from '../../../define.js';
+import { Inject, Injectable } from '@nestjs/common';
+import type { DriveFilesRepository } from '@/models/index.js';
+import { Endpoint } from '@/server/api/endpoint-base.js';
+import { DI } from '@/di-symbols.js';
+import { RoleService } from '@/core/RoleService.js';
import { ApiError } from '../../../error.js';
export const meta = {
@@ -74,23 +77,6 @@ export const meta = {
properties: {
type: 'object',
optional: false, nullable: false,
- properties: {
- width: {
- type: 'number',
- optional: false, nullable: false,
- example: 1280,
- },
- height: {
- type: 'number',
- optional: false, nullable: false,
- example: 720,
- },
- avgColor: {
- type: 'string',
- optional: true, nullable: false,
- example: 'rgb(40,65,87)',
- },
- },
},
storedInternal: {
type: 'boolean',
@@ -114,15 +100,15 @@ export const meta = {
},
accessKey: {
type: 'string',
- optional: false, nullable: false,
+ optional: false, nullable: true,
},
thumbnailAccessKey: {
type: 'string',
- optional: false, nullable: false,
+ optional: false, nullable: true,
},
webpublicAccessKey: {
type: 'string',
- optional: false, nullable: false,
+ optional: false, nullable: true,
},
uri: {
type: 'string',
@@ -169,25 +155,61 @@ export const paramDef = {
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, paramDef, async (ps, me) => {
- const file = ps.fileId ? await DriveFiles.findOneBy({ id: ps.fileId }) : await DriveFiles.findOne({
- where: [{
- url: ps.url,
- }, {
- thumbnailUrl: ps.url,
- }, {
- webpublicUrl: ps.url,
- }],
- });
+@Injectable()
+export default class extends Endpoint<typeof meta, typeof paramDef> {
+ constructor(
+ @Inject(DI.driveFilesRepository)
+ private driveFilesRepository: DriveFilesRepository,
- if (file == null) {
- throw new ApiError(meta.errors.noSuchFile);
- }
+ private roleService: RoleService,
+ ) {
+ super(meta, paramDef, async (ps, me) => {
+ const file = ps.fileId ? await this.driveFilesRepository.findOneBy({ id: ps.fileId }) : await this.driveFilesRepository.findOne({
+ where: [{
+ url: ps.url,
+ }, {
+ thumbnailUrl: ps.url,
+ }, {
+ webpublicUrl: ps.url,
+ }],
+ });
- if (!me.isAdmin) {
- delete file.requestIp;
- delete file.requestHeaders;
- }
+ if (file == null) {
+ throw new ApiError(meta.errors.noSuchFile);
+ }
- return file;
-});
+ const isModerator = await this.roleService.isModerator(me);
+
+ return {
+ id: file.id,
+ userId: file.userId,
+ userHost: file.userHost,
+ isLink: file.isLink,
+ maybePorn: file.maybePorn,
+ maybeSensitive: file.maybeSensitive,
+ isSensitive: file.isSensitive,
+ folderId: file.folderId,
+ src: file.src,
+ uri: file.uri,
+ webpublicAccessKey: file.webpublicAccessKey,
+ thumbnailAccessKey: file.thumbnailAccessKey,
+ accessKey: file.accessKey,
+ webpublicType: file.webpublicType,
+ webpublicUrl: file.webpublicUrl,
+ thumbnailUrl: file.thumbnailUrl,
+ url: file.url,
+ storedInternal: file.storedInternal,
+ properties: file.properties,
+ blurhash: file.blurhash,
+ comment: file.comment,
+ size: file.size,
+ type: file.type,
+ name: file.name,
+ md5: file.md5,
+ createdAt: file.createdAt.toISOString(),
+ requestIp: isModerator ? file.requestIp : null,
+ requestHeaders: isModerator ? file.requestHeaders : null,
+ };
+ });
+ }
+}