+import { Op, QueryTypes } from 'sequelize'
import { BelongsTo, Column, CreatedAt, ForeignKey, Model, Scopes, Table, UpdatedAt } from 'sequelize-typescript'
+import { MServerBlocklist, MServerBlocklistAccountServer, MServerBlocklistFormattable } from '@server/types/models'
+import { ServerBlock } from '@shared/models'
+import { AttributesOnly } from '@shared/typescript-utils'
import { AccountModel } from '../account/account'
+import { createSafeIn, getSort, searchAttribute } from '../shared'
import { ServerModel } from './server'
-import { ServerBlock } from '../../../shared/models/blocklist'
-import { getSort, searchAttribute } from '../utils'
-import * as Bluebird from 'bluebird'
-import { MServerBlocklist, MServerBlocklistAccountServer, MServerBlocklistFormattable } from '@server/types/models'
-import { Op } from 'sequelize'
enum ScopeNames {
WITH_ACCOUNT = 'WITH_ACCOUNT',
}
]
})
-export class ServerBlocklistModel extends Model<ServerBlocklistModel> {
+export class ServerBlocklistModel extends Model<Partial<AttributesOnly<ServerBlocklistModel>>> {
@CreatedAt
createdAt: Date
})
BlockedServer: ServerModel
- static isServerMutedByMulti (accountIds: number[], targetServerId: number) {
+ static isServerMutedByAccounts (accountIds: number[], targetServerId: number) {
const query = {
attributes: [ 'accountId', 'id' ],
where: {
})
}
- static loadByAccountAndHost (accountId: number, host: string): Bluebird<MServerBlocklist> {
+ static loadByAccountAndHost (accountId: number, host: string): Promise<MServerBlocklist> {
const query = {
where: {
accountId
return ServerBlocklistModel.findOne(query)
}
- static listHostsBlockedBy (accountIds: number[]): Bluebird<string[]> {
+ static listHostsBlockedBy (accountIds: number[]): Promise<string[]> {
const query = {
attributes: [ ],
where: {
.then(entries => entries.map(e => e.BlockedServer.host))
}
+ static getBlockStatus (byAccountIds: number[], hosts: string[]): Promise<{ host: string, accountId: number }[]> {
+ const rawQuery = `SELECT "server"."host", "serverBlocklist"."accountId" ` +
+ `FROM "serverBlocklist" ` +
+ `INNER JOIN "server" ON "server"."id" = "serverBlocklist"."targetServerId" ` +
+ `WHERE "server"."host" IN (:hosts) ` +
+ `AND "serverBlocklist"."accountId" IN (${createSafeIn(ServerBlocklistModel.sequelize, byAccountIds)})`
+
+ return ServerBlocklistModel.sequelize.query(rawQuery, {
+ type: QueryTypes.SELECT as QueryTypes.SELECT,
+ replacements: { hosts }
+ })
+ }
+
static listForApi (parameters: {
start: number
count: number
order: getSort(sort),
where: {
accountId,
+
...searchAttribute(search, '$BlockedServer.host$')
}
}
- return ServerBlocklistModel
- .scope([ ScopeNames.WITH_ACCOUNT, ScopeNames.WITH_SERVER ])
- .findAndCountAll<MServerBlocklistAccountServer>(query)
- .then(({ rows, count }) => {
- return { total: count, data: rows }
- })
+ return Promise.all([
+ ServerBlocklistModel.scope(ScopeNames.WITH_SERVER).count(query),
+ ServerBlocklistModel.scope([ ScopeNames.WITH_ACCOUNT, ScopeNames.WITH_SERVER ]).findAll<MServerBlocklistAccountServer>(query)
+ ]).then(([ total, data ]) => ({ total, data }))
}
toFormattedJSON (this: MServerBlocklistFormattable): ServerBlock {