From 3a4992633ee62d5edfbb484d9c6bcb3cf158489d Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Mon, 31 Jul 2023 14:34:36 +0200 Subject: Migrate server to ESM Sorry for the very big commit that may lead to git log issues and merge conflicts, but it's a major step forward: * Server can be faster at startup because imports() are async and we can easily lazy import big modules * Angular doesn't seem to support ES import (with .js extension), so we had to correctly organize peertube into a monorepo: * Use yarn workspace feature * Use typescript reference projects for dependencies * Shared projects have been moved into "packages", each one is now a node module (with a dedicated package.json/tsconfig.json) * server/tools have been moved into apps/ and is now a dedicated app bundled and published on NPM so users don't have to build peertube cli tools manually * server/tests have been moved into packages/ so we don't compile them every time we want to run the server * Use isolatedModule option: * Had to move from const enum to const (https://www.typescriptlang.org/docs/handbook/enums.html#objects-vs-enums) * Had to explictely specify "type" imports when used in decorators * Prefer tsx (that uses esbuild under the hood) instead of ts-node to load typescript files (tests with mocha or scripts): * To reduce test complexity as esbuild doesn't support decorator metadata, we only test server files that do not import server models * We still build tests files into js files for a faster CI * Remove unmaintained peertube CLI import script * Removed some barrels to speed up execution (less imports) --- server/models/abuse/sql/abuse-query-builder.ts | 167 ------------------------- 1 file changed, 167 deletions(-) delete mode 100644 server/models/abuse/sql/abuse-query-builder.ts (limited to 'server/models/abuse/sql/abuse-query-builder.ts') diff --git a/server/models/abuse/sql/abuse-query-builder.ts b/server/models/abuse/sql/abuse-query-builder.ts deleted file mode 100644 index 282d4541a..000000000 --- a/server/models/abuse/sql/abuse-query-builder.ts +++ /dev/null @@ -1,167 +0,0 @@ - -import { exists } from '@server/helpers/custom-validators/misc' -import { forceNumber } from '@shared/core-utils' -import { AbuseFilter, AbuseState, AbuseVideoIs } from '@shared/models' -import { buildBlockedAccountSQL, buildSortDirectionAndField } from '../../shared' - -export type BuildAbusesQueryOptions = { - start: number - count: number - sort: string - - // search - search?: string - searchReporter?: string - searchReportee?: string - - // video related - searchVideo?: string - searchVideoChannel?: string - videoIs?: AbuseVideoIs - - // filters - id?: number - predefinedReasonId?: number - filter?: AbuseFilter - - state?: AbuseState - - // accountIds - serverAccountId?: number - userAccountId?: number - - reporterAccountId?: number -} - -function buildAbuseListQuery (options: BuildAbusesQueryOptions, type: 'count' | 'id') { - const whereAnd: string[] = [] - const replacements: any = {} - - const joins = [ - 'LEFT JOIN "videoAbuse" ON "videoAbuse"."abuseId" = "abuse"."id"', - 'LEFT JOIN "video" ON "videoAbuse"."videoId" = "video"."id"', - 'LEFT JOIN "videoBlacklist" ON "videoBlacklist"."videoId" = "video"."id"', - 'LEFT JOIN "videoChannel" ON "video"."channelId" = "videoChannel"."id"', - 'LEFT JOIN "account" "reporterAccount" ON "reporterAccount"."id" = "abuse"."reporterAccountId"', - 'LEFT JOIN "account" "flaggedAccount" ON "flaggedAccount"."id" = "abuse"."flaggedAccountId"', - 'LEFT JOIN "commentAbuse" ON "commentAbuse"."abuseId" = "abuse"."id"', - 'LEFT JOIN "videoComment" ON "commentAbuse"."videoCommentId" = "videoComment"."id"' - ] - - if (options.serverAccountId || options.userAccountId) { - whereAnd.push( - '"abuse"."reporterAccountId" IS NULL OR ' + - '"abuse"."reporterAccountId" NOT IN (' + buildBlockedAccountSQL([ options.serverAccountId, options.userAccountId ]) + ')' - ) - } - - if (options.reporterAccountId) { - whereAnd.push('"abuse"."reporterAccountId" = :reporterAccountId') - replacements.reporterAccountId = options.reporterAccountId - } - - if (options.search) { - const searchWhereOr = [ - '"video"."name" ILIKE :search', - '"videoChannel"."name" ILIKE :search', - `"videoAbuse"."deletedVideo"->>'name' ILIKE :search`, - `"videoAbuse"."deletedVideo"->'channel'->>'displayName' ILIKE :search`, - '"reporterAccount"."name" ILIKE :search', - '"flaggedAccount"."name" ILIKE :search' - ] - - replacements.search = `%${options.search}%` - whereAnd.push('(' + searchWhereOr.join(' OR ') + ')') - } - - if (options.searchVideo) { - whereAnd.push('"video"."name" ILIKE :searchVideo') - replacements.searchVideo = `%${options.searchVideo}%` - } - - if (options.searchVideoChannel) { - whereAnd.push('"videoChannel"."name" ILIKE :searchVideoChannel') - replacements.searchVideoChannel = `%${options.searchVideoChannel}%` - } - - if (options.id) { - whereAnd.push('"abuse"."id" = :id') - replacements.id = options.id - } - - if (options.state) { - whereAnd.push('"abuse"."state" = :state') - replacements.state = options.state - } - - if (options.videoIs === 'deleted') { - whereAnd.push('"videoAbuse"."deletedVideo" IS NOT NULL') - } else if (options.videoIs === 'blacklisted') { - whereAnd.push('"videoBlacklist"."id" IS NOT NULL') - } - - if (options.predefinedReasonId) { - whereAnd.push(':predefinedReasonId = ANY("abuse"."predefinedReasons")') - replacements.predefinedReasonId = options.predefinedReasonId - } - - if (options.filter === 'video') { - whereAnd.push('"videoAbuse"."id" IS NOT NULL') - } else if (options.filter === 'comment') { - whereAnd.push('"commentAbuse"."id" IS NOT NULL') - } else if (options.filter === 'account') { - whereAnd.push('"videoAbuse"."id" IS NULL AND "commentAbuse"."id" IS NULL') - } - - if (options.searchReporter) { - whereAnd.push('"reporterAccount"."name" ILIKE :searchReporter') - replacements.searchReporter = `%${options.searchReporter}%` - } - - if (options.searchReportee) { - whereAnd.push('"flaggedAccount"."name" ILIKE :searchReportee') - replacements.searchReportee = `%${options.searchReportee}%` - } - - const prefix = type === 'count' - ? 'SELECT COUNT("abuse"."id") AS "total"' - : 'SELECT "abuse"."id" ' - - let suffix = '' - if (type !== 'count') { - - if (options.sort) { - const order = buildAbuseOrder(options.sort) - suffix += `${order} ` - } - - if (exists(options.count)) { - const count = forceNumber(options.count) - suffix += `LIMIT ${count} ` - } - - if (exists(options.start)) { - const start = forceNumber(options.start) - suffix += `OFFSET ${start} ` - } - } - - const where = whereAnd.length !== 0 - ? `WHERE ${whereAnd.join(' AND ')}` - : '' - - return { - query: `${prefix} FROM "abuse" ${joins.join(' ')} ${where} ${suffix}`, - replacements - } -} - -function buildAbuseOrder (value: string) { - const { direction, field } = buildSortDirectionAndField(value) - - return `ORDER BY "abuse"."${field}" ${direction}` -} - -export { - buildAbuseListQuery -} -- cgit v1.2.3