diff --git a/handlers/handlerfactory.cpp b/handlers/handlerfactory.cpp index a035004..a5938fc 100644 --- a/handlers/handlerfactory.cpp +++ b/handlers/handlerfactory.cpp @@ -18,6 +18,7 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ + #include "handlerfactory.h" #include "handler.h" #include "handlerdefault.h" @@ -31,75 +32,49 @@ SOFTWARE. #include "handlercategory.h" #include "handlerhistory.h" #include "handlerpagedelete.h" -class Factory + +std::unique_ptr HandlerFactory::createHandler(const std::string &action, Session &userSession) { - Template &templ; - Database &db; - Session &userSession; - UrlProvider &urlProvider; - ICache &cache; - HandlerConfig &handlerConfig; - - public: - Factory(HandlerConfig &handlerConfig, Template &templ, Database &db, Session &usersession, UrlProvider &urlprovider, - ICache &cache) - : handlerConfig(handlerConfig), templ(templ), db(db), userSession(usersession), urlProvider(urlprovider), - cache(cache) - { - } - - template inline std::unique_ptr produce() - { - return std::make_unique(handlerConfig, templ, db, userSession, urlProvider, cache); - } -}; - -std::unique_ptr createHandler(const std::string &action, HandlerConfig &handlerConfig, Template &templ, - Database &db, Session &usersession, UrlProvider &urlprovider, ICache &cache) -{ - - Factory producer(handlerConfig, templ, db, usersession, urlprovider, cache); - if(action == "" || action == "index") { - return producer.produce(); + return produce(userSession); } if(action == "show") { - return producer.produce(); + return produce(userSession); } if(action == "edit") { - return producer.produce(); + return produce(userSession); } if(action == "login") { - return producer.produce(); + return produce(userSession); } if(action == "search") { - return producer.produce(); + return produce(userSession); } if(action == "delete") { - return producer.produce(); + return produce(userSession); } if(action == "allpages") { - return producer.produce(); + return produce(userSession); } if(action == "allcategories") { - return producer.produce(); + return produce(userSession); } if(action == "showcat") { - return producer.produce(); + return produce(userSession); } if(action == "recent") { - return producer.produce(); + return produce(userSession); } - return producer.produce(); + return produce(userSession); } diff --git a/handlers/handlerfactory.h b/handlers/handlerfactory.h index 660e364..7120b89 100644 --- a/handlers/handlerfactory.h +++ b/handlers/handlerfactory.h @@ -3,7 +3,25 @@ #include #include "handler.h" #include "../template.h" +class HandlerFactory +{ + HandlerConfig &handlerConfig; + Template &templ; + Database &db; + UrlProvider &urlProvider; + ICache &cache; + + template inline std::unique_ptr produce(Session &userSession) + { + return std::make_unique(handlerConfig, templ, db, userSession, urlProvider, cache); + } + + public: + HandlerFactory(HandlerConfig &handlerConfig, Template &templ, Database &db, UrlProvider &urlprovider, ICache &cache) + : handlerConfig(handlerConfig), templ(templ), db(db), urlProvider(urlprovider), cache(cache) + { + } + std::unique_ptr createHandler(const std::string &action, Session &userSession); +}; -std::unique_ptr createHandler(const std::string &action, HandlerConfig &handlerConfig, Template &templ, - Database &db, Session &usersession, UrlProvider &urlprovider, ICache &cache); #endif // HANDLERFACTORY_H diff --git a/qswiki.cpp b/qswiki.cpp index 40aa066..ca72557 100644 --- a/qswiki.cpp +++ b/qswiki.cpp @@ -131,11 +131,13 @@ int main(int argc, char **argv) User::setAnon(anon.value()); Template siteTemplate{config.templateprefix, config.templatepath, config.urls, config.configVarResolver}; - UrlProvider urlprovider{config.urls}; + UrlProvider urlProvider{config.urls}; auto cache = createCache(config.configVarResolver); cache->clear(); - RequestWorker requestWorker(config.handlersConfig, *database, siteTemplate, urlprovider, *cache); + + HandlerFactory handlerFactory{config.handlersConfig, siteTemplate, *database.get(), urlProvider, *cache.get()}; + RequestWorker requestWorker{handlerFactory, *database->createSessionDao().get(), siteTemplate}; auto interface = createGateway(config); diff --git a/requestworker.cpp b/requestworker.cpp index 19a13c3..75f91c9 100644 --- a/requestworker.cpp +++ b/requestworker.cpp @@ -66,9 +66,7 @@ Response RequestWorker::processRequest(const Request &r) } } - auto handler = createHandler(r.param("action"), *this->handlerConfig, *this->templ, *this->db, session, - *this->urlProvider, *this->cache); - + auto handler = handlerFactory->createHandler(r.param("action"), session); try { Response response = handler->handle(r); diff --git a/requestworker.h b/requestworker.h index 1b7f2d9..7022dbe 100644 --- a/requestworker.h +++ b/requestworker.h @@ -9,27 +9,25 @@ #include "urlprovider.h" #include "database/sessiondao.h" #include "cache/fscache.h" +#include "handlers/handlerfactory.h" + class RequestWorker { - Database *db; Template *templ; UrlProvider *urlProvider; ICache *cache; - HandlerConfig *handlerConfig; - std::unique_ptr sessionDao; + HandlerFactory *handlerFactory; + SessionDao *sessionDao; private: Session retrieveSession(std::string token) const; public: - RequestWorker(HandlerConfig &handlerConfig, Database &db, Template &templ, UrlProvider &provider, ICache &cache) + RequestWorker(HandlerFactory &handlerFactory, SessionDao &sessionDao, Template &templ) { - this->handlerConfig = &handlerConfig; - this->db = &db; + this->handlerFactory = &handlerFactory; this->templ = &templ; - this->urlProvider = &provider; - this->sessionDao = db.createSessionDao(); - this->cache = &cache; + this->sessionDao = &sessionDao; } Response processRequest(const Request &r);