From f0fe0ace18ec1ffd0468e8171204bc5b5c77ac32 Mon Sep 17 00:00:00 2001 From: kirari04 Date: Sun, 14 Jan 2024 03:26:03 +0100 Subject: [PATCH] implemented database config --- cmd/init.go | 7 +- config/config.go | 291 +++++++++---------------------------------- configdb/configdb.go | 266 +++++++++++++++++++++++++++++++++++++++ inits/Models.go | 1 + models/Setting.go | 66 ++++++++++ 5 files changed, 395 insertions(+), 236 deletions(-) create mode 100644 configdb/configdb.go create mode 100644 models/Setting.go diff --git a/cmd/init.go b/cmd/init.go index c82f4b8..4f2492a 100644 --- a/cmd/init.go +++ b/cmd/init.go @@ -2,6 +2,7 @@ package cmd import ( "ch/kirari04/videocms/config" + "ch/kirari04/videocms/configdb" "ch/kirari04/videocms/helpers" "ch/kirari04/videocms/inits" "log" @@ -21,10 +22,12 @@ func Init() { } os.Exit(1) } - //setup captcha - inits.Captcha() // for setting up the database connection inits.Database() // for migrating all the models inits.Models() + // for setting up configuration from db + configdb.Setup() + //setup captcha + inits.Captcha() } diff --git a/config/config.go b/config/config.go index 9ac7430..ed9f14a 100755 --- a/config/config.go +++ b/config/config.go @@ -1,79 +1,79 @@ package config import ( - "ch/kirari04/videocms/models" "log" "os" "strconv" ) type Config struct { - AppName string `validate:"required,min=1,max=120"` - Host string `validate:"required,min=1,max=120"` + Host string `validate:"required,min=1,max=120"` - Project string `validate:"required,min=1,max=512"` - ProjectDocumentation string `validate:"required,min=1,max=512"` - ProjectDownload string `validate:"required,min=1,max=512"` + AppName string - JwtSecretKey string `validate:"required,min=8,max=512"` - JwtUploadSecretKey string `validate:"required,min=8,max=512"` + Project string + ProjectDocumentation string + ProjectDownload string - CookieDomain string `validate:"required,min=8,max=225"` + JwtSecretKey string + JwtUploadSecretKey string - ReloadHtml *bool `validate:"required,boolean"` - EncodingEnabled *bool `validate:"required,boolean"` - UploadEnabled *bool `validate:"required,boolean"` - RatelimitEnabled *bool `validate:"required,boolean"` - CloudflareEnabled *bool `validate:"required,boolean"` + CookieDomain string - MaxItemsMultiDelete int64 `validate:"required,number,min=1"` - MaxRunningEncodes int64 `validate:"required,number,min=1"` + ReloadHtml *bool + EncodingEnabled *bool + UploadEnabled *bool + RatelimitEnabled *bool + CloudflareEnabled *bool - MaxUploadFilesize int64 `validate:"required,number,min=1"` - MaxUploadChuncksize int64 `validate:"required,number,min=1"` - MaxUploadSessions int64 `validate:"required,number,min=1"` - MaxPostSize int64 `validate:"required,number,min=1"` + MaxItemsMultiDelete int64 + MaxRunningEncodes int64 + + MaxUploadFilesize int64 + MaxUploadChuncksize int64 + MaxUploadSessions int64 + MaxPostSize int64 FolderVideoQualitysPub string `validate:"required,min=1,max=255"` FolderVideoQualitysPriv string `validate:"required,min=1,max=255"` FolderVideoUploadsPriv string `validate:"required,min=1,max=255"` - CorsAllowOrigins string `validate:"required,min=1"` - CorsAllowHeaders string `validate:"required,min=1"` - CorsAllowCredentials *bool `validate:"required,boolean"` - - CaptchaEnabled *bool `validate:"required,boolean"` - CaptchaType string `validate:"required_if=CaptchaEnabled 1,omitempty,min=1,max=10"` - Captcha_Recaptcha_PrivateKey string `validate:"required_if=CaptchaType recaptcha,omitempty,min=1,max=40"` - Captcha_Recaptcha_PublicKey string `validate:"required_if=CaptchaType recaptcha,omitempty,min=1,max=40"` - Captcha_Hcaptcha_PrivateKey string `validate:"required_if=CaptchaType hcaptcha,omitempty,min=1,max=42"` - Captcha_Hcaptcha_PublicKey string `validate:"required_if=CaptchaType hcaptcha,omitempty,uuid_rfc4122"` - - EncodeHls240p *bool `validate:"required,boolean"` - EncodeHls360p *bool `validate:"required,boolean"` - EncodeHls480p *bool `validate:"required,boolean"` - EncodeHls720p *bool `validate:"required,boolean"` - EncodeHls1080p *bool `validate:"required,boolean"` - EncodeHls1440p *bool `validate:"required,boolean"` - EncodeHls2160p *bool `validate:"required,boolean"` - EncodeAv1 *bool `validate:"required,boolean"` - EncodeVp9 *bool `validate:"required,boolean"` - EncodeH264 *bool `validate:"required,boolean"` - - FFmpegAv1AudioCodec string `validate:"required,min=1"` - FFmpegVp9AudioCodec string `validate:"required,min=1"` - FFmpegH264AudioCodec string `validate:"required,min=1"` - - FFmpegAv1Crf int `validate:"required,number,min=1,max=50"` - FFmpegVp9Crf int `validate:"required,number,min=1,max=50"` - FFmpegH264Crf int `validate:"required,number,min=1,max=50"` - - FFmpegAv1Height int64 `validate:"required,number,min=1"` - FFmpegAv1Width int64 `validate:"required,number,min=1"` - FFmpegVp9Height int64 `validate:"required,number,min=1"` - FFmpegVp9Width int64 `validate:"required,number,min=1"` - FFmpegH264Height int64 `validate:"required,number,min=1"` - FFmpegH264Width int64 `validate:"required,number,min=1"` + CorsAllowOrigins string + CorsAllowHeaders string + CorsAllowCredentials *bool + + CaptchaEnabled *bool + CaptchaType string + Captcha_Recaptcha_PrivateKey string + Captcha_Recaptcha_PublicKey string + Captcha_Hcaptcha_PrivateKey string + Captcha_Hcaptcha_PublicKey string + + EncodeHls240p *bool + EncodeHls360p *bool + EncodeHls480p *bool + EncodeHls720p *bool + EncodeHls1080p *bool + EncodeHls1440p *bool + EncodeHls2160p *bool + EncodeAv1 *bool + EncodeVp9 *bool + EncodeH264 *bool + + FFmpegAv1AudioCodec string + FFmpegVp9AudioCodec string + FFmpegH264AudioCodec string + + FFmpegAv1Crf int + FFmpegVp9Crf int + FFmpegH264Crf int + + FFmpegAv1Height int64 + FFmpegAv1Width int64 + FFmpegVp9Height int64 + FFmpegVp9Width int64 + FFmpegH264Height int64 + FFmpegH264Width int64 } type PublicConfig struct { @@ -122,191 +122,14 @@ var EXTENSIONS []string = []string{ } func Setup() { - ENV.AppName = getEnv("AppName", "VideoCMS") ENV.Host = getEnv("Host", ":3000") - ENV.Project = getEnv("Project", "https://github.com/notfound") - ENV.ProjectDocumentation = getEnv("ProjectDocumentation", "https://github.com/notfound") - ENV.ProjectDownload = getEnv("ProjectDownload", "https://github.com/notfound") - - ENV.JwtSecretKey = getEnv("JwtSecretKey", "secretkey") - ENV.JwtUploadSecretKey = getEnv("JwtUploadSecretKey", "secretkeyupload") - - ENV.CookieDomain = getEnv("CookieDomain", "secretkey") - - ENV.ReloadHtml = getEnv_bool("ReloadHtml", boolPtr(false)) - ENV.EncodingEnabled = getEnv_bool("EncodingEnabled", boolPtr(true)) - ENV.UploadEnabled = getEnv_bool("UploadEnabled", boolPtr(true)) - ENV.RatelimitEnabled = getEnv_bool("RatelimitEnabled", boolPtr(false)) - ENV.CloudflareEnabled = getEnv_bool("CloudflareEnabled", boolPtr(false)) - - ENV.MaxItemsMultiDelete = getEnv_int64("MaxItemsMultiDelete", 1000) - ENV.MaxRunningEncodes = getEnv_int64("MaxRunningEncodes", 1) - - ENV.MaxUploadFilesize = getEnv_int64("MaxUploadFilesize", 5*1024*1024*1024) // 5gb - ENV.MaxUploadChuncksize = getEnv_int64("MaxUploadChuncksize", 20*1024*1024) // 20mb - ENV.MaxUploadSessions = getEnv_int64("MaxUploadSessions", 10) - ENV.MaxPostSize = getEnv_int64("MaxPostSize", 100*1024*1024) // 100mb - ENV.FolderVideoQualitysPriv = getEnv("FolderVideoQualitysPriv", "./videos/qualitys") ENV.FolderVideoQualitysPub = getEnv("FolderVideoQualitysPub", "/videos/qualitys") ENV.FolderVideoUploadsPriv = getEnv("FolderVideoUploadsPriv", "./videos/uploads") - - ENV.CorsAllowHeaders = getEnv("CorsAllowHeaders", "*") - ENV.CorsAllowOrigins = getEnv("CorsAllowOrigins", "*") - ENV.CorsAllowCredentials = getEnv_bool("CorsAllowCredentials", boolPtr(true)) - - ENV.CaptchaEnabled = getEnv_bool("CaptchaEnabled", boolPtr(false)) - ENV.CaptchaType = getEnv("CaptchaType", "") - ENV.Captcha_Recaptcha_PrivateKey = getEnv("Captcha_Recaptcha_PrivateKey", "") - ENV.Captcha_Recaptcha_PublicKey = getEnv("Captcha_Recaptcha_PublicKey", "") - ENV.Captcha_Hcaptcha_PrivateKey = getEnv("Captcha_Hcaptcha_PrivateKey", "") - ENV.Captcha_Hcaptcha_PublicKey = getEnv("Captcha_Hcaptcha_PublicKey", "") - - ENV.EncodeHls240p = getEnv_bool("EncodeHls240p", boolPtr(true)) - ENV.EncodeHls360p = getEnv_bool("EncodeHls360p", boolPtr(true)) - ENV.EncodeHls480p = getEnv_bool("EncodeHls480p", boolPtr(true)) - ENV.EncodeHls720p = getEnv_bool("EncodeHls720p", boolPtr(true)) - ENV.EncodeHls1080p = getEnv_bool("EncodeHls1080p", boolPtr(true)) - ENV.EncodeHls1440p = getEnv_bool("EncodeHls1440p", boolPtr(false)) - ENV.EncodeHls2160p = getEnv_bool("EncodeHls2160p", boolPtr(false)) - ENV.EncodeAv1 = getEnv_bool("EncodeAv1", boolPtr(false)) - ENV.EncodeVp9 = getEnv_bool("EncodeVp9", boolPtr(false)) - ENV.EncodeH264 = getEnv_bool("EncodeH264", boolPtr(false)) - - ENV.FFmpegAv1AudioCodec = getEnv("FFmpegAv1AudioCodec", "aac") - ENV.FFmpegVp9AudioCodec = getEnv("FFmpegVp9AudioCodec", "libopus") - ENV.FFmpegH264AudioCodec = getEnv("FFmpegH264AudioCodec", "aac") - - ENV.FFmpegAv1Crf = getEnv_int("FFmpegAv1Crf", 30) - ENV.FFmpegVp9Crf = getEnv_int("FFmpegVp9Crf", 30) - ENV.FFmpegH264Crf = getEnv_int("FFmpegH264Crf", 30) - - ENV.FFmpegAv1Height = getEnv_int64("FFmpegAv1Height", 480) - ENV.FFmpegAv1Width = getEnv_int64("FFmpegAv1Width", 854) - ENV.FFmpegVp9Height = getEnv_int64("FFmpegVp9Height", 480) - ENV.FFmpegVp9Width = getEnv_int64("FFmpegVp9Width", 854) - ENV.FFmpegH264Height = getEnv_int64("FFmpegH264Height", 480) - ENV.FFmpegH264Width = getEnv_int64("FFmpegH264Width", 854) - - models.AvailableQualitys = []models.AvailableQuality{ - { - Name: "240p", - FolderName: "240p", - Height: 240, - Width: 426, - Crf: 30, - Type: "hls", - Muted: true, - OutputFile: "out.m3u8", - Enabled: *ENV.EncodeHls240p, - }, - { - Name: "360p", - FolderName: "360p", - Height: 360, - Width: 640, - Crf: 26, - Type: "hls", - Muted: true, - OutputFile: "out.m3u8", - Enabled: *ENV.EncodeHls360p, - }, - { - Name: "480p", - FolderName: "480p", - Height: 480, - Width: 854, - Crf: 26, - Type: "hls", - Muted: true, - OutputFile: "out.m3u8", - Enabled: *ENV.EncodeHls480p, - }, - { - Name: "720p", - FolderName: "720p", - Height: 720, - Width: 1280, - Crf: 26, - Type: "hls", - Muted: true, - OutputFile: "out.m3u8", - Enabled: *ENV.EncodeHls720p, - }, - { - Name: "1080p", - FolderName: "1080p", - Height: 1080, - Width: 1920, - Crf: 24, - Type: "hls", - Muted: true, - OutputFile: "out.m3u8", - Enabled: *ENV.EncodeHls1080p, - }, - { - Name: "1440p", - FolderName: "1440p", - Height: 1440, - Width: 2560, - Crf: 24, - Type: "hls", - Muted: true, - OutputFile: "out.m3u8", - Enabled: *ENV.EncodeHls1440p, - }, - { - Name: "2160p", - FolderName: "2160p", - Height: 2160, - Width: 3840, - Crf: 24, - Type: "hls", - Muted: true, - OutputFile: "out.m3u8", - Enabled: *ENV.EncodeHls2160p, - }, - // downloads - { - Name: "av1", - FolderName: "av1", - Height: ENV.FFmpegAv1Height, - Width: ENV.FFmpegAv1Width, - Crf: ENV.FFmpegAv1Crf, - Type: "av1", - Muted: false, - AudioCodec: ENV.FFmpegAv1AudioCodec, - OutputFile: "out.mp4", - Enabled: *ENV.EncodeAv1, - }, - { - Name: "vp9", - FolderName: "vp9", - Height: ENV.FFmpegVp9Height, - Width: ENV.FFmpegVp9Width, - Crf: ENV.FFmpegVp9Crf, - Type: "vp9", - Muted: false, - AudioCodec: ENV.FFmpegVp9AudioCodec, - OutputFile: "out.webm", - Enabled: *ENV.EncodeVp9, - }, - { - Name: "h264", - FolderName: "h264", - Height: ENV.FFmpegH264Height, - Width: ENV.FFmpegH264Width, - Crf: ENV.FFmpegH264Crf, - Type: "h264", - Muted: false, - AudioCodec: ENV.FFmpegH264AudioCodec, - OutputFile: "out.mp4", - Enabled: *ENV.EncodeH264, - }, - } } +// getters func getEnv(key string, defaultValue string) string { if value := os.Getenv(key); value != "" { return value diff --git a/configdb/configdb.go b/configdb/configdb.go new file mode 100644 index 0000000..7fa2a32 --- /dev/null +++ b/configdb/configdb.go @@ -0,0 +1,266 @@ +package configdb + +import ( + "ch/kirari04/videocms/config" + "ch/kirari04/videocms/inits" + "ch/kirari04/videocms/models" + "fmt" + "log" + "strconv" + + "github.com/go-playground/validator/v10" +) + +func Setup() { + var setting models.Setting + if res := inits.DB.FirstOrCreate(&setting); res.Error != nil { + log.Fatalln("Failed to load settings", res.Error) + } + + config.ENV.AppName = getEnvDb(&setting.AppName, "VideoCMS") + + config.ENV.Project = getEnvDb(&setting.Project, "https://github.com/notfound") + config.ENV.ProjectDocumentation = getEnvDb(&setting.ProjectDocumentation, "https://github.com/notfound") + config.ENV.ProjectDownload = getEnvDb(&setting.ProjectDownload, "https://github.com/notfound") + + config.ENV.JwtSecretKey = getEnvDb(&setting.JwtSecretKey, "secretkey") + config.ENV.JwtUploadSecretKey = getEnvDb(&setting.JwtUploadSecretKey, "secretkeyupload") + + config.ENV.CookieDomain = getEnvDb(&setting.CookieDomain, "secretkey") + + config.ENV.ReloadHtml = getEnvDb_bool(&setting.ReloadHtml, boolPtr(false)) + config.ENV.EncodingEnabled = getEnvDb_bool(&setting.EncodingEnabled, boolPtr(true)) + config.ENV.UploadEnabled = getEnvDb_bool(&setting.UploadEnabled, boolPtr(true)) + config.ENV.RatelimitEnabled = getEnvDb_bool(&setting.RatelimitEnabled, boolPtr(false)) + config.ENV.CloudflareEnabled = getEnvDb_bool(&setting.CloudflareEnabled, boolPtr(false)) + + config.ENV.MaxItemsMultiDelete = getEnvDb_int64(&setting.MaxItemsMultiDelete, 1000) + config.ENV.MaxRunningEncodes = getEnvDb_int64(&setting.MaxRunningEncodes, 1) + + config.ENV.MaxUploadFilesize = getEnvDb_int64(&setting.MaxUploadFilesize, 5*1024*1024*1024) // 5gb + config.ENV.MaxUploadChuncksize = getEnvDb_int64(&setting.MaxUploadChuncksize, 20*1024*1024) // 20mb + config.ENV.MaxUploadSessions = getEnvDb_int64(&setting.MaxUploadSessions, 10) + config.ENV.MaxPostSize = getEnvDb_int64(&setting.MaxPostSize, 100*1024*1024) // 100mb + + config.ENV.CorsAllowHeaders = getEnvDb(&setting.CorsAllowHeaders, "*") + config.ENV.CorsAllowOrigins = getEnvDb(&setting.CorsAllowOrigins, "*") + config.ENV.CorsAllowCredentials = getEnvDb_bool(&setting.CorsAllowCredentials, boolPtr(true)) + + config.ENV.CaptchaEnabled = getEnvDb_bool(&setting.CaptchaEnabled, boolPtr(false)) + config.ENV.CaptchaType = getEnvDb(&setting.CaptchaType, "") + config.ENV.Captcha_Recaptcha_PrivateKey = getEnvDb(&setting.Captcha_Recaptcha_PrivateKey, "") + config.ENV.Captcha_Recaptcha_PublicKey = getEnvDb(&setting.Captcha_Recaptcha_PublicKey, "") + config.ENV.Captcha_Hcaptcha_PrivateKey = getEnvDb(&setting.Captcha_Hcaptcha_PrivateKey, "") + config.ENV.Captcha_Hcaptcha_PublicKey = getEnvDb(&setting.Captcha_Hcaptcha_PublicKey, "") + + config.ENV.EncodeHls240p = getEnvDb_bool(&setting.EncodeHls240p, boolPtr(true)) + config.ENV.EncodeHls360p = getEnvDb_bool(&setting.EncodeHls360p, boolPtr(true)) + config.ENV.EncodeHls480p = getEnvDb_bool(&setting.EncodeHls480p, boolPtr(true)) + config.ENV.EncodeHls720p = getEnvDb_bool(&setting.EncodeHls720p, boolPtr(true)) + config.ENV.EncodeHls1080p = getEnvDb_bool(&setting.EncodeHls1080p, boolPtr(true)) + config.ENV.EncodeHls1440p = getEnvDb_bool(&setting.EncodeHls1440p, boolPtr(false)) + config.ENV.EncodeHls2160p = getEnvDb_bool(&setting.EncodeHls2160p, boolPtr(false)) + config.ENV.EncodeAv1 = getEnvDb_bool(&setting.EncodeAv1, boolPtr(false)) + config.ENV.EncodeVp9 = getEnvDb_bool(&setting.EncodeVp9, boolPtr(false)) + config.ENV.EncodeH264 = getEnvDb_bool(&setting.EncodeH264, boolPtr(false)) + + config.ENV.FFmpegAv1AudioCodec = getEnvDb(&setting.FFmpegAv1AudioCodec, "aac") + config.ENV.FFmpegVp9AudioCodec = getEnvDb(&setting.FFmpegVp9AudioCodec, "libopus") + config.ENV.FFmpegH264AudioCodec = getEnvDb(&setting.FFmpegH264AudioCodec, "aac") + + config.ENV.FFmpegAv1Crf = getEnvDb_int(&setting.FFmpegAv1Crf, 30) + config.ENV.FFmpegVp9Crf = getEnvDb_int(&setting.FFmpegVp9Crf, 30) + config.ENV.FFmpegH264Crf = getEnvDb_int(&setting.FFmpegH264Crf, 30) + + config.ENV.FFmpegAv1Height = getEnvDb_int64(&setting.FFmpegAv1Height, 480) + config.ENV.FFmpegAv1Width = getEnvDb_int64(&setting.FFmpegAv1Width, 854) + config.ENV.FFmpegVp9Height = getEnvDb_int64(&setting.FFmpegVp9Height, 480) + config.ENV.FFmpegVp9Width = getEnvDb_int64(&setting.FFmpegVp9Width, 854) + config.ENV.FFmpegH264Height = getEnvDb_int64(&setting.FFmpegH264Height, 480) + config.ENV.FFmpegH264Width = getEnvDb_int64(&setting.FFmpegH264Width, 854) + + // validate config before saving + validate := validator.New(validator.WithRequiredStructEnabled()) + err := validate.Struct(&setting) + if err != nil { + log.Fatalln("Invalid configuration", err) + } + if res := inits.DB.Save(&setting); res.Error != nil { + log.Fatalln("failed to save db configuration", res.Error) + } + + models.AvailableQualitys = []models.AvailableQuality{ + { + Name: "240p", + FolderName: "240p", + Height: 240, + Width: 426, + Crf: 30, + Type: "hls", + Muted: true, + OutputFile: "out.m3u8", + Enabled: *config.ENV.EncodeHls240p, + }, + { + Name: "360p", + FolderName: "360p", + Height: 360, + Width: 640, + Crf: 26, + Type: "hls", + Muted: true, + OutputFile: "out.m3u8", + Enabled: *config.ENV.EncodeHls360p, + }, + { + Name: "480p", + FolderName: "480p", + Height: 480, + Width: 854, + Crf: 26, + Type: "hls", + Muted: true, + OutputFile: "out.m3u8", + Enabled: *config.ENV.EncodeHls480p, + }, + { + Name: "720p", + FolderName: "720p", + Height: 720, + Width: 1280, + Crf: 26, + Type: "hls", + Muted: true, + OutputFile: "out.m3u8", + Enabled: *config.ENV.EncodeHls720p, + }, + { + Name: "1080p", + FolderName: "1080p", + Height: 1080, + Width: 1920, + Crf: 24, + Type: "hls", + Muted: true, + OutputFile: "out.m3u8", + Enabled: *config.ENV.EncodeHls1080p, + }, + { + Name: "1440p", + FolderName: "1440p", + Height: 1440, + Width: 2560, + Crf: 24, + Type: "hls", + Muted: true, + OutputFile: "out.m3u8", + Enabled: *config.ENV.EncodeHls1440p, + }, + { + Name: "2160p", + FolderName: "2160p", + Height: 2160, + Width: 3840, + Crf: 24, + Type: "hls", + Muted: true, + OutputFile: "out.m3u8", + Enabled: *config.ENV.EncodeHls2160p, + }, + // downloads + { + Name: "av1", + FolderName: "av1", + Height: config.ENV.FFmpegAv1Height, + Width: config.ENV.FFmpegAv1Width, + Crf: config.ENV.FFmpegAv1Crf, + Type: "av1", + Muted: false, + AudioCodec: config.ENV.FFmpegAv1AudioCodec, + OutputFile: "out.mp4", + Enabled: *config.ENV.EncodeAv1, + }, + { + Name: "vp9", + FolderName: "vp9", + Height: config.ENV.FFmpegVp9Height, + Width: config.ENV.FFmpegVp9Width, + Crf: config.ENV.FFmpegVp9Crf, + Type: "vp9", + Muted: false, + AudioCodec: config.ENV.FFmpegVp9AudioCodec, + OutputFile: "out.webm", + Enabled: *config.ENV.EncodeVp9, + }, + { + Name: "h264", + FolderName: "h264", + Height: config.ENV.FFmpegH264Height, + Width: config.ENV.FFmpegH264Width, + Crf: config.ENV.FFmpegH264Crf, + Type: "h264", + Muted: false, + AudioCodec: config.ENV.FFmpegH264AudioCodec, + OutputFile: "out.mp4", + Enabled: *config.ENV.EncodeH264, + }, + } +} + +func getEnvDb(value *string, defaultValue string) string { + if value != nil && *value != "" { + return *value + } + *value = defaultValue + return defaultValue +} + +func getEnvDb_bool(value *string, defaultValue *bool) *bool { + if value != nil && *value != "" { + switch *value { + case "true": + return boolPtr(true) + case "1": + return boolPtr(true) + case "false": + return boolPtr(false) + case "0": + return boolPtr(false) + default: + log.Panicf("Failed to get bool from value: %v", value) + } + } + if defaultValue != nil && *defaultValue == true { + *value = "true" + } else { + *value = "false" + } + return defaultValue +} + +func getEnvDb_int64(value *string, defaultValue int64) int64 { + if value != nil && *value != "" { + res, err := strconv.ParseInt(*value, 10, 64) + if err != nil { + log.Panicf("Failed to parse int from value %v", value) + } + return res + } + *value = fmt.Sprint(defaultValue) + return defaultValue +} +func getEnvDb_int(value *string, defaultValue int) int { + if value != nil && *value != "" { + res, err := strconv.Atoi(*value) + if err != nil { + log.Panicf("Failed to parse int from value %v", value) + } + return res + } + *value = fmt.Sprint(defaultValue) + return defaultValue +} + +func boolPtr(boolean bool) *bool { + return &boolean +} diff --git a/inits/Models.go b/inits/Models.go index 60c5068..eadbec3 100755 --- a/inits/Models.go +++ b/inits/Models.go @@ -21,6 +21,7 @@ func Models() { mustRun(DB.AutoMigrate(&models.Webhook{})) mustRun(DB.AutoMigrate(&models.Server{})) mustRun(DB.AutoMigrate(&models.WebPage{})) + mustRun(DB.AutoMigrate(&models.Setting{})) } func mustRun(err error) { diff --git a/models/Setting.go b/models/Setting.go new file mode 100644 index 0000000..2817c97 --- /dev/null +++ b/models/Setting.go @@ -0,0 +1,66 @@ +package models + +type Setting struct { + Model + AppName string `validate:"required,min=1,max=120" gorm:"size:120;"` + + Project string `validate:"required,min=1,max=512" gorm:"size:512;"` + ProjectDocumentation string `validate:"required,min=1,max=512" gorm:"size:512;"` + ProjectDownload string `validate:"required,min=1,max=512" gorm:"size:512;"` + + JwtSecretKey string `validate:"required,min=8,max=512" gorm:"size:512;"` + JwtUploadSecretKey string `validate:"required,min=8,max=512" gorm:"size:512;"` + + CookieDomain string `validate:"required,min=8,max=225" gorm:"size:225;"` + + ReloadHtml string `validate:"required,boolean"` + EncodingEnabled string `validate:"required,boolean"` + UploadEnabled string `validate:"required,boolean"` + RatelimitEnabled string `validate:"required,boolean"` + CloudflareEnabled string `validate:"required,boolean"` + + MaxItemsMultiDelete string `validate:"required,number,min=1"` + MaxRunningEncodes string `validate:"required,number,min=1"` + + MaxUploadFilesize string `validate:"required,number,min=1"` + MaxUploadChuncksize string `validate:"required,number,min=1"` + MaxUploadSessions string `validate:"required,number,min=1"` + MaxPostSize string `validate:"required,number,min=1"` + + CorsAllowOrigins string `validate:"required,min=1,max=1000" gorm:"size:1000;"` + CorsAllowHeaders string `validate:"required,min=1,max=1000" gorm:"size:1000;"` + CorsAllowCredentials string `validate:"required,boolean"` + + CaptchaEnabled string `validate:"required,boolean"` + CaptchaType string `validate:"required_if=CaptchaEnabled 1,omitempty,min=1,max=10" gorm:"size:10;"` + Captcha_Recaptcha_PrivateKey string `validate:"required_if=CaptchaType recaptcha,omitempty,min=1,max=40" gorm:"size:40;"` + Captcha_Recaptcha_PublicKey string `validate:"required_if=CaptchaType recaptcha,omitempty,min=1,max=40" gorm:"size:40;"` + Captcha_Hcaptcha_PrivateKey string `validate:"required_if=CaptchaType hcaptcha,omitempty,min=1,max=42" gorm:"size:42;"` + Captcha_Hcaptcha_PublicKey string `validate:"required_if=CaptchaType hcaptcha,omitempty,uuid_rfc4122"` + + EncodeHls240p string `validate:"required,boolean"` + EncodeHls360p string `validate:"required,boolean"` + EncodeHls480p string `validate:"required,boolean"` + EncodeHls720p string `validate:"required,boolean"` + EncodeHls1080p string `validate:"required,boolean"` + EncodeHls1440p string `validate:"required,boolean"` + EncodeHls2160p string `validate:"required,boolean"` + EncodeAv1 string `validate:"required,boolean"` + EncodeVp9 string `validate:"required,boolean"` + EncodeH264 string `validate:"required,boolean"` + + FFmpegAv1AudioCodec string `validate:"required,min=1,max=40" gorm:"size:40;"` + FFmpegVp9AudioCodec string `validate:"required,min=1,max=40" gorm:"size:40;"` + FFmpegH264AudioCodec string `validate:"required,min=1,max=40" gorm:"size:40;"` + + FFmpegAv1Crf string `validate:"required,number,min=1,max=50"` + FFmpegVp9Crf string `validate:"required,number,min=1,max=50"` + FFmpegH264Crf string `validate:"required,number,min=1,max=50"` + + FFmpegAv1Height string `validate:"required,number,min=1"` + FFmpegAv1Width string `validate:"required,number,min=1"` + FFmpegVp9Height string `validate:"required,number,min=1"` + FFmpegVp9Width string `validate:"required,number,min=1"` + FFmpegH264Height string `validate:"required,number,min=1"` + FFmpegH264Width string `validate:"required,number,min=1"` +}