Begin dynamic content generators
This commit is contained in:
		
							
								
								
									
										8
									
								
								dynamic/dynamiccontent.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								dynamic/dynamiccontent.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,8 @@
 | 
				
			|||||||
 | 
					#include "dynamiccontent.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DynamicContent::DynamicContent(Template &templ, Database &database, UrlProvider &provider)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						this->templ = &templ;
 | 
				
			||||||
 | 
						this->database = &database;
 | 
				
			||||||
 | 
						this->urlProvider = &provider;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										22
									
								
								dynamic/dynamiccontent.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								dynamic/dynamiccontent.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,22 @@
 | 
				
			|||||||
 | 
					#ifndef DYNAMICCONTENT_H
 | 
				
			||||||
 | 
					#define DYNAMICCONTENT_H
 | 
				
			||||||
 | 
					#include <string>
 | 
				
			||||||
 | 
					#include "../database/database.h"
 | 
				
			||||||
 | 
					#include "../template.h"
 | 
				
			||||||
 | 
					#include "../urlprovider.h"
 | 
				
			||||||
 | 
					class DynamicContent
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  protected:
 | 
				
			||||||
 | 
						Template *templ;
 | 
				
			||||||
 | 
						Database *database;
 | 
				
			||||||
 | 
						UrlProvider *urlProvider;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  public:
 | 
				
			||||||
 | 
						DynamicContent(Template &templ, Database &database, UrlProvider &urlProvider);
 | 
				
			||||||
 | 
						virtual std::string render() = 0;
 | 
				
			||||||
 | 
						virtual ~DynamicContent()
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif // DYNAMICCONTENT_H
 | 
				
			||||||
							
								
								
									
										43
									
								
								dynamic/dynamiccontentpostlist.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								dynamic/dynamiccontentpostlist.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,43 @@
 | 
				
			|||||||
 | 
					#include <chrono>
 | 
				
			||||||
 | 
					#include "dynamiccontentpostlist.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void DynamicContentPostList::setCategory(std::string catname)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						this->catname = catname;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					std::string DynamicContentPostList::render()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						auto categoryDao = this->database->createCategoryDao();
 | 
				
			||||||
 | 
						auto pageDao = this->database->createPageDao();
 | 
				
			||||||
 | 
						auto revisionDao = this->database->createRevisionDao();
 | 
				
			||||||
 | 
						QueryOption option;
 | 
				
			||||||
 | 
						auto members = categoryDao->fetchMembers(this->catname, option);
 | 
				
			||||||
 | 
						std::vector<std::pair<std::string, time_t>> pageList;
 | 
				
			||||||
 | 
						for(std::string &member : members)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							auto revision = revisionDao->getRevisionForPage(member, 1);
 | 
				
			||||||
 | 
							pageList.push_back({member, revision->timestamp});
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						std::sort(pageList.begin(), pageList.end(),
 | 
				
			||||||
 | 
								  [](std::pair<std::string, time_t> &a, std::pair<std::string, time_t> &b) { return a.second > b.second; });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						std::string postListBegin = this->templ->loadResolvedPart("dynamic/postlistbegin");
 | 
				
			||||||
 | 
						std::string postListEnd = this->templ->loadResolvedPart("dynamic/postlistend");
 | 
				
			||||||
 | 
						std::string postLink = this->templ->loadResolvedPart("dynamic/postlistlink");
 | 
				
			||||||
 | 
						std::stringstream stream;
 | 
				
			||||||
 | 
						stream << postListBegin;
 | 
				
			||||||
 | 
						for(auto &pair : pageList)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							std::string link = this->urlProvider->page(pair.first);
 | 
				
			||||||
 | 
							std::string date = utils::toISODate(pair.second);
 | 
				
			||||||
 | 
							Varreplacer replacer{"{"};
 | 
				
			||||||
 | 
							replacer.addKeyValue("url", link);
 | 
				
			||||||
 | 
							replacer.addKeyValue("date", date);
 | 
				
			||||||
 | 
							replacer.addKeyValue("page", pair.first);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							stream << replacer.parse(postLink);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						stream << postListEnd;
 | 
				
			||||||
 | 
						return stream.str();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										16
									
								
								dynamic/dynamiccontentpostlist.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								dynamic/dynamiccontentpostlist.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,16 @@
 | 
				
			|||||||
 | 
					#ifndef DYNAMICCONTENTPOSTLIST_H
 | 
				
			||||||
 | 
					#define DYNAMICCONTENTPOSTLIST_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "dynamiccontent.h"
 | 
				
			||||||
 | 
					class DynamicContentPostList : public DynamicContent
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  private:
 | 
				
			||||||
 | 
						std::string catname;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  public:
 | 
				
			||||||
 | 
						using DynamicContent::DynamicContent;
 | 
				
			||||||
 | 
						void setCategory(std::string catname);
 | 
				
			||||||
 | 
						std::string render() override;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif // DYNAMICCONTENTPOSTLIST_H
 | 
				
			||||||
@@ -1,5 +1,6 @@
 | 
				
			|||||||
#ifndef HANDLER_H
 | 
					#ifndef HANDLER_H
 | 
				
			||||||
#define HANDLER_H
 | 
					#define HANDLER_H
 | 
				
			||||||
 | 
					#include <memory>
 | 
				
			||||||
#include "../config.h"
 | 
					#include "../config.h"
 | 
				
			||||||
#include "../response.h"
 | 
					#include "../response.h"
 | 
				
			||||||
#include "../request.h"
 | 
					#include "../request.h"
 | 
				
			||||||
@@ -9,6 +10,8 @@
 | 
				
			|||||||
#include "../database/queryoption.h"
 | 
					#include "../database/queryoption.h"
 | 
				
			||||||
#include "../logger.h"
 | 
					#include "../logger.h"
 | 
				
			||||||
#include "../cache/icache.h"
 | 
					#include "../cache/icache.h"
 | 
				
			||||||
 | 
					#include "../dynamic/dynamiccontent.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Handler
 | 
					class Handler
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  protected:
 | 
					  protected:
 | 
				
			||||||
@@ -53,6 +56,12 @@ class Handler
 | 
				
			|||||||
	virtual ~Handler()
 | 
						virtual ~Handler()
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						template <class T> inline std::shared_ptr<T> createDynamic()
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return std::make_shared<T>(*this->templ, *this->database, *this->urlProvider);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Response errorResponse(std::string errortitle, std::string errormessage, int status = 200);
 | 
						Response errorResponse(std::string errortitle, std::string errormessage, int status = 200);
 | 
				
			||||||
	std::string createPageTitle(std::string append);
 | 
						std::string createPageTitle(std::string append);
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user