package main import ( "fmt" "log" "main/mvc/controllers" "main/mvc/controllers/controllers_pages" "main/mvc/models" "main/mvc/models/models_pages" "main/tools" "net/http" ) func main() { var err error // Инициализация конфига if err := models.Cfg.Load("config.json"); err != nil { log.Fatal(err) } // Загрузка постов if err := models_pages.LoadPosts(models.Cfg.PostsDir); err != nil { log.Fatal(err) } // Инициализация приложения (обязательно после инициализации конфига) if err := models.InitApp(); err != nil { log.Fatal(err) } // Добавление префикса в виде домена сервера к записям в лог log.SetPrefix(fmt.Sprintf("%s | ", models.Cfg.ServerDomain)) // Настройка маршрутов и запуск if setupRoutesAndRun() != nil { log.Fatal(err) } } func setupRoutesAndRun() error { // Настройка маршрутов router := setupRoutes() // Запуск сервера if ok, err := tools.IsIPInUse(models.Cfg.ServerIP); err != nil { return err } else if ok { runServer(models.Cfg.ServerIP, models.Cfg.ServerPort, router) } else { runServer(models.Cfg.LocalIP, models.Cfg.LocalPort, router) } return nil } // Настраивает маршруты func setupRoutes() *http.ServeMux { router := http.NewServeMux() // Цепочка обработчиков, которые сработают до отдачи страницы юзеру m := controllers.MiddlewaresChain // Обработка статических файлов router.Handle(models.Cfg.AssetsDir, m(controllers.StaticHandler())) // Главные странички { // Обработка главной страницы (русская версия) router.Handle("/ru/", m(controllers_pages.MainRuPageHandler())) // Обработка главной страницы router.Handle("/", m(controllers_pages.MainPageHandler())) // Обработка страницы со списком постов router.Handle("/posts/", m(controllers_pages.PostsPageHandler())) // Обработка страничек постов for key := range models_pages.GetPosts() { postLink := string(key) router.Handle(postLink, m(controllers_pages.PostPageHandler())) } } return router } // Запускает сервер на указанном IP, PORT func runServer(ip, port string, router http.Handler) { addr := ip + port log.Println("Run on", addr) log.Fatal(http.ListenAndServe(addr, router)) }