import { FindAndCountOptions, json, QueryTypes } from 'sequelize'
import { AllowNull, Column, CreatedAt, DataType, DefaultScope, Is, Model, Table, UpdatedAt } from 'sequelize-typescript'
import { MPlugin, MPluginFormattable } from '@server/types/models'
-import { AttributesOnly } from '@shared/core-utils'
-import { PeerTubePlugin, PluginType, RegisterServerSettingOptions } from '../../../shared/models'
+import { AttributesOnly } from '@shared/typescript-utils'
+import { PeerTubePlugin, PluginType, RegisterServerSettingOptions, SettingEntries, SettingValue } from '../../../shared/models'
import {
isPluginDescriptionValid,
isPluginHomepage,
isPluginNameValid,
- isPluginTypeValid,
- isPluginVersionValid
+ isPluginStableOrUnstableVersionValid,
+ isPluginStableVersionValid,
+ isPluginTypeValid
} from '../../helpers/custom-validators/plugins'
import { getSort, throwIfNotValid } from '../utils'
type: number
@AllowNull(false)
- @Is('PluginVersion', value => throwIfNotValid(value, isPluginVersionValid, 'version'))
+ @Is('PluginVersion', value => throwIfNotValid(value, isPluginStableOrUnstableVersionValid, 'version'))
@Column
version: string
@AllowNull(true)
- @Is('PluginLatestVersion', value => throwIfNotValid(value, isPluginVersionValid, 'version'))
+ @Is('PluginLatestVersion', value => throwIfNotValid(value, isPluginStableVersionValid, 'version'))
@Column
latestVersion: string
return PluginModel.findOne(query)
.then(p => {
- if (!p || !p.settings || p.settings === undefined) {
+ if (!p?.settings || p.settings === undefined) {
const registered = registeredSettings.find(s => s.name === settingName)
if (!registered || registered.default === undefined) return undefined
return PluginModel.findOne(query)
.then(p => {
- const result: { [settingName: string ]: string | boolean } = {}
+ const result: SettingEntries = {}
for (const name of settingNames) {
- if (!p || !p.settings || p.settings[name] === undefined) {
+ if (!p?.settings || p.settings[name] === undefined) {
const registered = registeredSettings.find(s => s.name === name)
if (registered?.default !== undefined) {
})
}
- static setSetting (pluginName: string, pluginType: PluginType, settingName: string, settingValue: string) {
+ static setSetting (pluginName: string, pluginType: PluginType, settingName: string, settingValue: SettingValue) {
const query = {
where: {
name: pluginName,
if (!c) return undefined
const value = c.value
- if (typeof value === 'string' && value.startsWith('{')) {
- try {
- return JSON.parse(value)
- } catch {
- return value
- }
+ try {
+ return JSON.parse(value)
+ } catch {
+ return value
}
-
- return c.value
})
}
if (options.pluginType) query.where['type'] = options.pluginType
- return PluginModel
- .findAndCountAll<MPlugin>(query)
- .then(({ rows, count }) => {
- return { total: count, data: rows }
- })
+ return Promise.all([
+ PluginModel.count(query),
+ PluginModel.findAll<MPlugin>(query)
+ ]).then(([ total, data ]) => ({ total, data }))
}
static listInstalled (): Promise<MPlugin[]> {
}
getPublicSettings (registeredSettings: RegisterServerSettingOptions[]) {
- const result: { [ name: string ]: string } = {}
+ const result: SettingEntries = {}
const settings = this.settings || {}
for (const r of registeredSettings) {
if (r.private !== false) continue
- result[r.name] = settings[r.name] || r.default || null
+ result[r.name] = settings[r.name] ?? r.default ?? null
}
return result