Ещё немного рефакторинга

This commit is contained in:
B4D_US3R 2025-03-04 23:22:30 +05:00
parent 26bb547c43
commit 005fb8e7dc

86
main.go
View file

@ -16,6 +16,24 @@ import (
"gopkg.in/yaml.v3" "gopkg.in/yaml.v3"
) )
type ImageProvider interface {
GetImage() string
}
type LocalProvider struct{}
type S3Provider struct {
confHundler ConfHandler
}
func (p LocalProvider) GetImage() string {
return GetRandImg()
}
func (p S3Provider) GetImage() string {
return p.confHundler.GetRandImgS3()
}
func GetPicsArray() []string { func GetPicsArray() []string {
files, err := os.ReadDir("images") files, err := os.ReadDir("images")
if err != nil { if err != nil {
@ -37,23 +55,6 @@ func (conf *ConfHandler) GetRandImgS3() string {
return picsArray[rand.Intn(len(picsArray))] return picsArray[rand.Intn(len(picsArray))]
} }
func (conf *ConfHandler) ReturnObjectName(w http.ResponseWriter, req *http.Request) {
var picFilename io.Reader = strings.NewReader(conf.GetRandImgS3())
log.Println("Картинка отдана")
io.Copy(w, picFilename)
}
func (conf *ConfHandler) ReturnHTMLS3(w http.ResponseWriter, req *http.Request) {
htmlOpen, err := template.ParseFiles("dist/index.html")
if err != nil {
log.Println(err.Error())
return
}
image := conf.GetRandImgS3()
log.Println(image)
htmlOpen.Execute(w, image)
}
func GetRandImg() string { func GetRandImg() string {
picsArray := GetPicsArray() picsArray := GetPicsArray()
if len(picsArray) == 0 { if len(picsArray) == 0 {
@ -62,23 +63,25 @@ func GetRandImg() string {
return picsArray[rand.Intn(len(picsArray))] return picsArray[rand.Intn(len(picsArray))]
} }
func ReturnPicFilename(w http.ResponseWriter, req *http.Request) { func ReturnPicFilename(provider ImageProvider) http.HandlerFunc {
var picFilename io.Reader = strings.NewReader(GetRandImg()) return func(w http.ResponseWriter, r *http.Request) {
log.Println("Картинка отдана") image := provider.GetImage()
io.Copy(w, picFilename) io.Copy(w, strings.NewReader(image))
log.Println("Картинка отдана")
}
} }
func ReturnHTML(w http.ResponseWriter, req *http.Request) { func ReturnHTML(provider ImageProvider) http.HandlerFunc {
htmlOpen, err := template.ParseFiles("dist/index.html") return func(w http.ResponseWriter, r *http.Request) {
if err != nil { htmlOpen, err := template.ParseFiles("dist/index.html")
log.Println(err.Error()) if err != nil {
return log.Println(err.Error())
} return
image := GetRandImg() }
log.Println(image) image := provider.GetImage()
if err := htmlOpen.Execute(w, image); err != nil { if err := htmlOpen.Execute(w, image); err != nil {
log.Printf("Ошибка рендеринга HTML: %v", err) log.Printf("Ошибка рендеринга: %v", err)
http.Error(w, "Internal Server Error", http.StatusInternalServerError) }
} }
} }
@ -135,11 +138,11 @@ func main() {
http.Handle("/images/", http.StripPrefix("/images/", imagesDir)) http.Handle("/images/", http.StripPrefix("/images/", imagesDir))
http.Handle("/assets/", http.StripPrefix("/assets/", staticDir)) http.Handle("/assets/", http.StripPrefix("/assets/", staticDir))
var provider ImageProvider
if !conf.UseS3 { if !conf.UseS3 {
http.HandleFunc("/rand", ReturnPicFilename) provider = LocalProvider{}
http.HandleFunc("/", ReturnHTML)
} else { } else {
var confHandler ConfHandler
minioClient, err := minio.New(conf.Address, &minio.Options{ minioClient, err := minio.New(conf.Address, &minio.Options{
Creds: credentials.NewStaticV4(conf.AccessKey, conf.SecretKey, ""), Creds: credentials.NewStaticV4(conf.AccessKey, conf.SecretKey, ""),
Secure: true, Secure: true,
@ -148,11 +151,14 @@ func main() {
if err != nil { if err != nil {
log.Fatalln(err) log.Fatalln(err)
} }
confHandler.minioClient = minioClient provider = S3Provider{
confHandler.ConfigHandler = conf confHundler: ConfHandler{
http.HandleFunc("/rand", confHandler.ReturnObjectName) ConfigHandler: conf,
http.HandleFunc("/", confHandler.ReturnHTMLS3) minioClient: minioClient,
},
}
} }
http.HandleFunc("/rand", ReturnPicFilename(provider))
http.HandleFunc("/", ReturnHTML(provider))
http.ListenAndServe(":3666", nil) http.ListenAndServe(":3666", nil)
} }