Refactor a little bit raw sql builders

pull/4840/head
Chocobozzz 2022-03-03 10:23:44 +01:00
parent bf521f51fc
commit 156c44c8f6
No known key found for this signature in database
GPG Key ID: 583A612D890159BE
11 changed files with 35 additions and 34 deletions

View File

@ -7,18 +7,20 @@ import { QueryTypes, Sequelize, Transaction } from 'sequelize'
*/
export class AbstractRunQuery {
protected sequelize: Sequelize
protected query: string
protected replacements: any = {}
protected runQuery (options: { transaction?: Transaction, logging?: boolean } = {}) {
constructor (protected readonly sequelize: Sequelize) {
}
protected runQuery (options: { nest?: boolean, transaction?: Transaction, logging?: boolean } = {}) {
const queryOptions = {
transaction: options.transaction,
logging: options.logging,
replacements: this.replacements,
type: QueryTypes.SELECT as QueryTypes.SELECT,
nest: false
nest: options.nest ?? false
}
return this.sequelize.query<any>(this.query, queryOptions)

View File

@ -1,3 +1,4 @@
export * from './abstract-run-query'
export * from './model-builder'
export * from './query'
export * from './update'

View File

@ -1,5 +1,5 @@
import { QueryTypes, Sequelize } from 'sequelize'
import { ModelBuilder } from '@server/models/shared'
import { Sequelize } from 'sequelize'
import { AbstractRunQuery, ModelBuilder } from '@server/models/shared'
import { getSort } from '@server/models/utils'
import { UserNotificationModelForApi } from '@server/types/models'
import { ActorImageType } from '@shared/models'
@ -10,28 +10,23 @@ export interface ListNotificationsOptions {
sort: string
offset: number
limit: number
sequelize: Sequelize
}
export class UserNotificationListQueryBuilder {
export class UserNotificationListQueryBuilder extends AbstractRunQuery {
private innerQuery: string
private replacements: any = {}
private query: string
constructor (private readonly options: ListNotificationsOptions) {
constructor (
protected readonly sequelize: Sequelize,
private readonly options: ListNotificationsOptions
) {
super(sequelize)
}
async listNotifications () {
this.buildQuery()
const results = await this.options.sequelize.query(this.query, {
replacements: this.replacements,
type: QueryTypes.SELECT,
nest: true
})
const modelBuilder = new ModelBuilder<UserNotificationModelForApi>(this.options.sequelize)
const results = await this.runQuery({ nest: true })
const modelBuilder = new ModelBuilder<UserNotificationModelForApi>(this.sequelize)
return modelBuilder.createModels(results, 'UserNotification')
}

View File

@ -249,8 +249,7 @@ export class UserNotificationModel extends Model<Partial<AttributesOnly<UserNoti
offset: start,
limit: count,
sort,
where,
sequelize: this.sequelize
where
}
if (unread !== undefined) query.where['read'] = !unread
@ -261,7 +260,7 @@ export class UserNotificationModel extends Model<Partial<AttributesOnly<UserNoti
count === 0
? [] as UserNotificationModelForApi[]
: new UserNotificationListQueryBuilder(query).listNotifications()
: new UserNotificationListQueryBuilder(this.sequelize, query).listNotifications()
]).then(([ total, data ]) => ({ total, data }))
}

View File

@ -1,8 +1,9 @@
import { Sequelize } from 'sequelize'
import validator from 'validator'
import { createSafeIn } from '@server/models/utils'
import { MUserAccountId } from '@server/types/models'
import { ActorImageType } from '@shared/models'
import validator from 'validator'
import { AbstractRunQuery } from './abstract-run-query'
import { AbstractRunQuery } from '../../../../shared/abstract-run-query'
import { VideoTableAttributes } from './video-table-attributes'
/**
@ -19,8 +20,11 @@ export class AbstractVideoQueryBuilder extends AbstractRunQuery {
protected tables: VideoTableAttributes
constructor (protected readonly mode: 'list' | 'get') {
super()
constructor (
protected readonly sequelize: Sequelize,
protected readonly mode: 'list' | 'get'
) {
super(sequelize)
this.tables = new VideoTableAttributes(this.mode)
}

View File

@ -12,7 +12,7 @@ export class VideoFileQueryBuilder extends AbstractVideoQueryBuilder {
protected attributes: { [key: string]: string }
constructor (protected readonly sequelize: Sequelize) {
super('get')
super(sequelize, 'get')
}
queryWebTorrentVideos (options: BuildVideoGetQueryOptions) {

View File

@ -51,8 +51,8 @@ export class VideoModelBuilder {
private readonly buildOpts = { raw: true, isNewRecord: false }
constructor (
readonly mode: 'get' | 'list',
readonly tables: VideoTableAttributes
private readonly mode: 'get' | 'list',
private readonly tables: VideoTableAttributes
) {
}

View File

@ -6,7 +6,7 @@
*/
export class VideoTableAttributes {
constructor (readonly mode: 'get' | 'list') {
constructor (private readonly mode: 'get' | 'list') {
}

View File

@ -110,7 +110,7 @@ export class VideosModelGetQuerySubBuilder extends AbstractVideoQueryBuilder {
])
constructor (protected readonly sequelize: Sequelize) {
super('get')
super(sequelize, 'get')
}
queryVideos (options: BuildVideoGetQueryOptions) {

View File

@ -5,7 +5,7 @@ import { WEBSERVER } from '@server/initializers/constants'
import { buildDirectionAndField, createSafeIn } from '@server/models/utils'
import { MUserAccountId, MUserId } from '@server/types/models'
import { VideoInclude, VideoPrivacy, VideoState } from '@shared/models'
import { AbstractRunQuery } from './shared/abstract-run-query'
import { AbstractRunQuery } from '../../../shared/abstract-run-query'
/**
*
@ -93,7 +93,7 @@ export class VideosIdListQueryBuilder extends AbstractRunQuery {
private offset = ''
constructor (protected readonly sequelize: Sequelize) {
super()
super(sequelize)
}
queryVideoIds (options: BuildVideosListQueryOptions) {

View File

@ -19,7 +19,7 @@ export class VideosModelListQueryBuilder extends AbstractVideoQueryBuilder {
private readonly videoModelBuilder: VideoModelBuilder
constructor (protected readonly sequelize: Sequelize) {
super('list')
super(sequelize, 'list')
this.videoModelBuilder = new VideoModelBuilder(this.mode, this.tables)
}