Introduce proper HandlerFactory and reduce dependencies of RequestWorker

This commit is contained in:
Albert S. 2019-09-29 20:57:46 +02:00
parent 0ccc20454b
commit 8364ace683
5 changed files with 46 additions and 55 deletions

View File

@ -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<Handler> 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 <class T> inline std::unique_ptr<T> produce()
{
return std::make_unique<T>(handlerConfig, templ, db, userSession, urlProvider, cache);
}
};
std::unique_ptr<Handler> 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<HandlerDefault>();
return produce<HandlerDefault>(userSession);
}
if(action == "show")
{
return producer.produce<HandlerPageView>();
return produce<HandlerPageView>(userSession);
}
if(action == "edit")
{
return producer.produce<HandlerPageEdit>();
return produce<HandlerPageEdit>(userSession);
}
if(action == "login")
{
return producer.produce<HandlerLogin>();
return produce<HandlerLogin>(userSession);
}
if(action == "search")
{
return producer.produce<HandlerSearch>();
return produce<HandlerSearch>(userSession);
}
if(action == "delete")
{
return producer.produce<HandlerPageDelete>();
return produce<HandlerPageDelete>(userSession);
}
if(action == "allpages")
{
return producer.produce<HandlerAllPages>();
return produce<HandlerAllPages>(userSession);
}
if(action == "allcategories")
{
return producer.produce<HandlerAllCategories>();
return produce<HandlerAllCategories>(userSession);
}
if(action == "showcat")
{
return producer.produce<HandlerCategory>();
return produce<HandlerCategory>(userSession);
}
if(action == "recent")
{
return producer.produce<HandlerHistory>();
return produce<HandlerHistory>(userSession);
}
return producer.produce<HandlerInvalidAction>();
return produce<HandlerInvalidAction>(userSession);
}

View File

@ -3,7 +3,25 @@
#include <memory>
#include "handler.h"
#include "../template.h"
class HandlerFactory
{
HandlerConfig &handlerConfig;
Template &templ;
Database &db;
UrlProvider &urlProvider;
ICache &cache;
template <class T> inline std::unique_ptr<T> produce(Session &userSession)
{
return std::make_unique<T>(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<Handler> createHandler(const std::string &action, Session &userSession);
};
std::unique_ptr<Handler> createHandler(const std::string &action, HandlerConfig &handlerConfig, Template &templ,
Database &db, Session &usersession, UrlProvider &urlprovider, ICache &cache);
#endif // HANDLERFACTORY_H

View File

@ -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);

View File

@ -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);

View File

@ -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> 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);