src/modules/option/option.model.ts
Properties |
ad_config |
Type : string | null
|
Decorators :
@IsString()
|
Defined in src/modules/option/option.model.ts:134
|
blocklist |
Type : Blocklist
|
Decorators :
@Type(undefined)
|
Defined in src/modules/option/option.model.ts:128
|
description |
Type : string
|
Decorators :
@IsString()
|
Defined in src/modules/option/option.model.ts:88
|
friend_links |
Type : KeyValueModel[]
|
Decorators :
@ArrayUnique()
|
Defined in src/modules/option/option.model.ts:116
|
keywords |
Type : string[]
|
Decorators :
@ArrayUnique()
|
Defined in src/modules/option/option.model.ts:94
|
meta |
Type : AppMeta
|
Decorators :
@prop({_id: false, default: undefined})
|
Defined in src/modules/option/option.model.ts:120
|
site_email |
Type : string
|
Decorators :
@IsEmail()
|
Defined in src/modules/option/option.model.ts:106
|
site_url |
Type : string
|
Decorators :
@IsUrl({require_protocol: true})
|
Defined in src/modules/option/option.model.ts:100
|
statement |
Type : string
|
Decorators :
@IsString()
|
Defined in src/modules/option/option.model.ts:111
|
sub_title |
Type : string
|
Decorators :
@IsString()
|
Defined in src/modules/option/option.model.ts:83
|
title |
Type : string
|
Decorators :
@IsString()
|
Defined in src/modules/option/option.model.ts:78
|
Optional updated_at |
Type : Date
|
Decorators :
@prop({default: undefined})
|
Defined in src/modules/option/option.model.ts:137
|
import { prop, modelOptions } from '@typegoose/typegoose'
import { Type } from 'class-transformer'
import { IsString, IsInt, IsObject, IsUrl, IsEmail, IsArray } from 'class-validator'
import { IsOptional, IsNotEmpty, ValidateNested, ArrayUnique } from 'class-validator'
import { KeyValueModel } from '@app/models/key-value.model'
import { getProviderByTypegooseClass } from '@app/transformers/model.transformer'
import { APP_BIZ } from '@app/app.config'
export const DEFAULT_OPTION: Option = Object.freeze<Option>({
title: 'NodePress',
sub_title: 'Blog server app',
description: 'RESTful API service for blog',
keywords: [],
statement: '',
site_url: 'https://github.com/surmon-china/nodepress',
site_email: '[email protected]',
friend_links: [
{
name: APP_BIZ.FE_NAME,
value: APP_BIZ.FE_URL
}
],
meta: { likes: 0 },
blocklist: {
ips: [],
mails: [],
keywords: []
},
ad_config: ''
})
class AppMeta {
@IsInt()
@prop({ default: 0 })
likes: number
}
// user block list
export class Blocklist {
@ArrayUnique()
@IsArray()
@IsOptional()
@prop({ type: () => [String], default: [] })
ips: string[]
@ArrayUnique()
@IsArray()
@IsOptional()
@prop({ type: () => [String], default: [] })
mails: string[]
@ArrayUnique()
@IsArray()
@IsOptional()
@prop({ type: () => [String], default: [] })
keywords: string[]
}
@modelOptions({
schemaOptions: {
versionKey: false,
timestamps: {
createdAt: false,
updatedAt: 'updated_at'
}
}
})
export class Option {
@IsString()
@IsNotEmpty({ message: 'title?' })
@prop({ required: true, validate: /\S+/ })
title: string
@IsString()
@IsNotEmpty({ message: 'sub title?' })
@prop({ required: true, validate: /\S+/ })
sub_title: string
@IsString()
@IsNotEmpty()
@prop({ required: true })
description: string
@ArrayUnique()
@IsArray()
@IsOptional()
@prop({ default: [], type: () => [String] })
keywords: string[]
@IsUrl({ require_protocol: true })
@IsString()
@IsNotEmpty()
@prop({ required: true })
site_url: string
@IsEmail()
@IsString()
@IsNotEmpty()
@prop({ required: true })
site_email: string
@IsString()
@IsOptional()
@prop({ default: '' })
statement: string
@ArrayUnique()
@IsArray()
@prop({ _id: false, default: [], type: () => [KeyValueModel] })
friend_links: KeyValueModel[]
// site meta info
@prop({ _id: false, default: { ...DEFAULT_OPTION.meta } })
meta: AppMeta
// site user block list
@Type(() => Blocklist)
@ValidateNested()
@IsObject()
@IsOptional()
@prop({ _id: false, default: { ...DEFAULT_OPTION.blocklist } })
blocklist: Blocklist
// ad config
@IsString()
@IsOptional()
@prop({ type: String, default: null })
ad_config: string | null
@prop({ default: Date.now })
updated_at?: Date
}
export const OptionProvider = getProviderByTypegooseClass(Option)