func main() { confpath := flag.String("config", "", "readeef config path") flag.Parse() cfg, err := readeef.ReadConfig(*confpath) if err != nil { exitWithError(fmt.Sprintf("Error reading config from path '%s': %v", *confpath, err)) } if cfg.SearchIndex.BlevePath == "" { exitWithError("No bleve-path in search-index section of the config") } logger := readeef.NewLogger(cfg) repo, err := repo.New(cfg.DB.Driver, cfg.DB.Connect, logger) if err != nil { exitWithError(fmt.Sprintf("Error connecting to database: %v", err)) } si, err := readeef.NewSearchIndex(repo, cfg, logger) if err != nil { exitWithError(fmt.Sprintf("Error creating search index: %v", err)) } logger.Infoln("Getting all articles") if err := si.IndexAllArticles(); err != nil { exitWithError(fmt.Sprintf("Error indexing all articles: %v", err)) } }
func RegisterControllers(config readeef.Config, dispatcher *webfw.Dispatcher, logger webfw.Logger) error { repo, err := repo.New(config.DB.Driver, config.DB.Connect, logger) if err != nil { return err } if err := initAdminUser(repo, []byte(config.Auth.Secret)); err != nil { return err } dispatcher.Context.SetGlobal(readeef.CtxKey("config"), config) dispatcher.Context.SetGlobal(context.BaseCtxKey("readeefConfig"), config) dispatcher.Context.SetGlobal(readeef.CtxKey("repo"), repo) um := &readeef.UpdateFeedReceiverManager{} fm := readeef.NewFeedManager(repo, config, logger, um) if config.Hubbub.CallbackURL != "" { hubbub := readeef.NewHubbub(repo, config, logger, dispatcher.Pattern, fm.RemoveFeedChannel(), fm.AddFeedChannel(), um) if err := hubbub.InitSubscriptions(); err != nil { return fmt.Errorf("Error initializing hubbub subscriptions: %v", err) } fm.SetHubbub(hubbub) dispatcher.Handle(readeef.NewHubbubController(hubbub)) } var si readeef.SearchIndex if config.SearchIndex.BlevePath != "" { var err error si, err = readeef.NewSearchIndex(repo, config, logger) if err != nil { return fmt.Errorf("Error initializing bleve search: %v", err) } if si.IsNewIndex() { go func() { si.IndexAllArticles() }() } fm.SetSearchIndex(si) } fm.Start() nonce := readeef.NewNonce() var patternController webfw.PatternController var multiPatternController webfw.MultiPatternController patternController = NewAuth() dispatcher.Handle(patternController) multiPatternController = NewFeed(fm) dispatcher.Handle(multiPatternController) multiPatternController = NewArticle(config) dispatcher.Handle(multiPatternController) if config.SearchIndex.BlevePath != "" { patternController = NewSearch(si) dispatcher.Handle(patternController) } multiPatternController = NewUser() dispatcher.Handle(multiPatternController) patternController = NewUserSettings() dispatcher.Handle(patternController) patternController = NewNonce(nonce) dispatcher.Handle(patternController) if config.API.Fever { patternController = NewFever(fm) dispatcher.Handle(patternController) } webSocket := NewWebSocket(fm, si) dispatcher.Handle(webSocket) um.AddUpdateReceiver(webSocket) middleware.InitializeDefault(dispatcher) dispatcher.RegisterMiddleware(readeef.Auth{Pattern: dispatcher.Pattern, Nonce: nonce, IgnoreURLPrefix: config.Auth.IgnoreURLPrefix}) dispatcher.Renderer = renderer.NewRenderer(dispatcher.Config.Renderer.Dir, dispatcher.Config.Renderer.Base) dispatcher.Renderer.Delims("{%", "%}") go func() { for { select { case <-time.After(5 * time.Minute): nonce.Clean(45 * time.Second) } } }() return nil }