diff --git a/main.go b/main.go index 58ca9fd..1274015 100644 --- a/main.go +++ b/main.go @@ -12,11 +12,19 @@ import ( ) func main() { - var app *models.App var err error + // Инициализация конфига + if err := models.Cfg.Load("config.json"); err != nil { + log.Fatal(err) + } - // Инициализация приложения - if app, err = models.AppInit(); err != nil { + // Загрузка постов + if err := models_pages.LoadPosts(models.Cfg.PostsDir); err != nil { + log.Fatal(err) + } + + // Инициализация приложения (обязательно после инициализации конфига) + if err := models.InitApp(); err != nil { log.Fatal(err) } @@ -24,14 +32,14 @@ func main() { log.SetPrefix(fmt.Sprintf("%s | ", models.Cfg.ServerDomain)) // Настройка маршрутов и запуск - if setupRoutesAndRun(app) != nil { + if setupRoutesAndRun() != nil { log.Fatal(err) } } -func setupRoutesAndRun(a *models.App) error { +func setupRoutesAndRun() error { // Настройка маршрутов - router := setupRoutes(a) + router := setupRoutes() // Запуск сервера if ok, err := tools.IsIPInUse(models.Cfg.ServerIP); err != nil { @@ -46,7 +54,7 @@ func setupRoutesAndRun(a *models.App) error { } // Настраивает маршруты -func setupRoutes(a *models.App) *http.ServeMux { +func setupRoutes() *http.ServeMux { router := http.NewServeMux() // Цепочка обработчиков, которые сработают до отдачи страницы юзеру @@ -58,15 +66,15 @@ func setupRoutes(a *models.App) *http.ServeMux { // Главные странички { // Обработка главной страницы (русская версия) - router.Handle("/ru/", m(controllers_pages.MainRuPageHandler(a))) + router.Handle("/ru/", m(controllers_pages.MainRuPageHandler())) // Обработка главной страницы - router.Handle("/", m(controllers_pages.MainPageHandler(a))) + router.Handle("/", m(controllers_pages.MainPageHandler())) // Обработка страницы со списком постов - router.Handle("/posts/", m(controllers_pages.PostsPageHandler(a))) + router.Handle("/posts/", m(controllers_pages.PostsPageHandler())) // Обработка страничек постов for key := range models_pages.GetPosts() { postLink := string(key) - router.Handle(postLink, m(controllers_pages.PostPageHandler(a))) + router.Handle(postLink, m(controllers_pages.PostPageHandler())) } } diff --git a/mvc/controllers/controllers_pages/main.go b/mvc/controllers/controllers_pages/main.go index 346b09e..817c927 100644 --- a/mvc/controllers/controllers_pages/main.go +++ b/mvc/controllers/controllers_pages/main.go @@ -10,7 +10,7 @@ import ( ) // Обработчик главной страницы -func MainPageHandler(a *models.App) http.HandlerFunc { +func MainPageHandler() http.HandlerFunc { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { var err error @@ -40,7 +40,7 @@ func MainPageHandler(a *models.App) http.HandlerFunc { // Страничка рендерится только если ее нет в кэше pageData, ok := models.PagesCache.Get(models_pages.MainPageTmplName) if !ok { - pageData, err = models_pages.RenderMainPage(a.Templates, a.Version) + pageData, err = models_pages.RenderMainPage(models.App.Templates, models.App.Version) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return diff --git a/mvc/controllers/controllers_pages/main_ru.go b/mvc/controllers/controllers_pages/main_ru.go index ded761f..3fed8e9 100644 --- a/mvc/controllers/controllers_pages/main_ru.go +++ b/mvc/controllers/controllers_pages/main_ru.go @@ -7,14 +7,14 @@ import ( ) // Обработчик главной страницы -func MainRuPageHandler(a *models.App) http.HandlerFunc { +func MainRuPageHandler() http.HandlerFunc { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { var err error // Страничка рендерится только если ее нет в кэше pageData, ok := models.PagesCache.Get(models_pages.MainRuPageTmplName) if !ok { - pageData, err = models_pages.RenderMainRuPage(a.Templates, a.Version) + pageData, err = models_pages.RenderMainRuPage(models.App.Templates, models.App.Version) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return diff --git a/mvc/controllers/controllers_pages/post.go b/mvc/controllers/controllers_pages/post.go index da2f534..ba792bb 100644 --- a/mvc/controllers/controllers_pages/post.go +++ b/mvc/controllers/controllers_pages/post.go @@ -7,7 +7,7 @@ import ( ) // Обработчик главной страницы -func PostPageHandler(a *models.App) http.HandlerFunc { +func PostPageHandler() http.HandlerFunc { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { var err error @@ -19,7 +19,7 @@ func PostPageHandler(a *models.App) http.HandlerFunc { post := posts[models_pages.PostLink(r.URL.Path)] - pageData, err = models_pages.RenderPostPage(a.Templates, a.Version, post.Data) + pageData, err = models_pages.RenderPostPage(models.App.Templates, models.App.Version, post.Data) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return diff --git a/mvc/controllers/controllers_pages/posts.go b/mvc/controllers/controllers_pages/posts.go index 58522aa..40d89c1 100644 --- a/mvc/controllers/controllers_pages/posts.go +++ b/mvc/controllers/controllers_pages/posts.go @@ -7,14 +7,14 @@ import ( ) // Обработчик главной страницы -func PostsPageHandler(a *models.App) http.HandlerFunc { +func PostsPageHandler() http.HandlerFunc { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { var err error // Страничка рендерится только если ее нет в кэше pageData, ok := models.PagesCache.Get(models_pages.PostsPageTmplName) if !ok { - pageData, err = models_pages.RenderPostsPage(a.Templates, a.Version) + pageData, err = models_pages.RenderPostsPage(models.App.Templates, models.App.Version) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return diff --git a/mvc/models/app.go b/mvc/models/app.go index 36caa8b..40d015c 100644 --- a/mvc/models/app.go +++ b/mvc/models/app.go @@ -2,7 +2,6 @@ package models import ( "html/template" - "log" "os" "path/filepath" "strings" @@ -10,28 +9,29 @@ import ( ) // App хранит шаблоны и время запуска -type App struct { +type app struct { Templates *template.Template // Шаблоны страниц Version int64 // Время запуска } -// Инициализирует приложение -func AppInit() (*App, error) { +var ( + App = &app{} +) - a := &App{ - Version: time.Now().Unix(), - } +// Инициализирует приложение +func InitApp() error { + + App.Version = time.Now().Unix() // Загрузка шаблонов - if err := a.loadTemplates(Cfg.TemplatesDir, Cfg.TemplatesExt); err != nil { - log.Fatal(err) + if err := App.loadTemplates(Cfg.TemplatesDir, Cfg.TemplatesExt); err != nil { + return err } - - return a, nil + return nil } // Загрузка шаблонов -func (a *App) loadTemplates(templatesPath string, ext string) error { +func (a *app) loadTemplates(templatesPath string, ext string) error { tmpls := template.New("") err := filepath.Walk(templatesPath, func(path string, f os.FileInfo, err error) error { diff --git a/mvc/models/config.go b/mvc/models/config.go index 83d95af..680f661 100644 --- a/mvc/models/config.go +++ b/mvc/models/config.go @@ -2,7 +2,6 @@ package models import ( "encoding/json" - "log" "os" ) @@ -20,16 +19,10 @@ type config struct { } var ( - Cfg = config{} + Cfg = &config{} ) -func init() { - if err := Cfg.load("config.json"); err != nil { - log.Fatalf("%v", err) - } -} - -func (c *config) load(configPath string) error { +func (c *config) Load(configPath string) error { configFile, err := os.ReadFile(configPath) if err != nil { return err diff --git a/mvc/models/models_pages/posts.go b/mvc/models/models_pages/posts.go index 4686e21..2a930be 100644 --- a/mvc/models/models_pages/posts.go +++ b/mvc/models/models_pages/posts.go @@ -5,8 +5,6 @@ import ( "fmt" "html/template" "io" - "log" - "main/mvc/models" "main/tools" "os" "path/filepath" @@ -25,17 +23,11 @@ var ( allPosts = posts{} ) -func init() { - if err := loadPosts(models.Cfg.PostsDir); err != nil { - log.Fatalf("%v", err) - } -} - func GetPosts() posts { return allPosts } -func loadPosts(dir string) error { +func LoadPosts(dir string) error { err := filepath.Walk(dir, func(path string, f os.FileInfo, err error) error { if err != nil { return err diff --git a/posts/test.md b/posts/test.md index 4bc1270..3bb8880 100644 --- a/posts/test.md +++ b/posts/test.md @@ -1,2 +1,2 @@ # Это тестовый пост -Этот пост был написан в файле формата .md \ No newline at end of file +[Этот](/test/) пост был *написан* в файле **формата** .md