From a07e48f45e3b922a63aaae58b5bd816b8e324ee1 Mon Sep 17 00:00:00 2001 From: Andreas Baumann Date: Sun, 3 May 2015 21:14:36 +0200 Subject: started to add pages --- CMakeLists.txt | 5 ++- sql/sqlite3.sql | 8 ++++ src/content.hpp | 1 + src/page.cpp | 113 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/page.hpp | 60 +++++++++++++++++++++++++++ src/page_content.hpp | 32 +++++++++++++++ src/strusCms.cpp | 10 +++-- src/strusCms.hpp | 8 ++-- src/user.cpp | 25 +++++++++++- src/user.hpp | 5 ++- 10 files changed, 254 insertions(+), 13 deletions(-) create mode 100644 src/page.cpp create mode 100644 src/page.hpp create mode 100644 src/page_content.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index c1903c7..00812f3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -47,11 +47,12 @@ set(TEMPLATES set(SRC src/main.cpp src/strusCms.cpp - src/master.cpp - src/intro.cpp src/captcha.cpp src/mail.cpp + src/master.cpp + src/intro.cpp src/user.cpp + src/page.cpp ) add_custom_command( diff --git a/sql/sqlite3.sql b/sql/sqlite3.sql index 97ffcea..ff22476 100644 --- a/sql/sqlite3.sql +++ b/sql/sqlite3.sql @@ -31,3 +31,11 @@ create table login( user_id integer references user(id), last_login timestamp ); + +create table page( + id integer primary key autoincrement not null, + slug varchar(32) not null, + title varchar(32) not null, + content text, + unique( slug ) +); diff --git a/src/content.hpp b/src/content.hpp index ad8753d..5d9d504 100644 --- a/src/content.hpp +++ b/src/content.hpp @@ -4,5 +4,6 @@ #include "master_content.hpp" #include "intro_content.hpp" #include "user_content.hpp" +#include "page_content.hpp" #endif diff --git a/src/page.cpp b/src/page.cpp new file mode 100644 index 0000000..cff0118 --- /dev/null +++ b/src/page.cpp @@ -0,0 +1,113 @@ +#include "content.hpp" +#include "page.hpp" +#include "strusCms.hpp" + +#include +#include +#include + +namespace apps { + +// page + +page::page( strusCms &cms ) + : master( cms ) +{ + cms.dispatcher( ).assign( "/page/(\\w+)", &page::display, this, 1 ); + + cms.dispatcher( ).assign( "/api/pages", &page::api_pages, this ); + cms.dispatcher( ).assign( "/api/page/(\\w+)", &page::api_page, this, 1 ); +} + +void page::display( std::string slug ) +{ + content::page c( cms ); + ini( c ); + render( "page_display", c ); +} + +void page::api_pages( ) +{ + cppdb::session sql( cms.conn ); + cppdb::result r; + r = sql << "SELECT slug, title, content FROM page"; + std::vector pages; + while( r.next( ) ) { + Page page; + r >> page.slug; + r >> page.title; + r >> page.content; + pages.push_back( page ); + } + + cppcms::json::value j; + + j = pages; + + response( ).out( ) << j; +} + +void page::api_page( std::string slug ) +{ + cppdb::session sql( cms.conn ); + cppdb::result r; + r = sql << "SELECT slug, title, content FROM page WHERE slug=?" << slug << cppdb::row; + if( r.empty( ) ) { + return; + } + + Page page; + r >> page.slug; + r >> page.title; + r >> page.content; + + cppcms::json::value j; + + j = page; + + response( ).out( ) << j; +} + +void page::ini( content::page &c ) +{ + master::ini( c ); +} + +} // namespace apps + +namespace content { + +page::page( apps::strusCms &cms ) + : page_edit( cms ) +{ +} + +page_edit_form::page_edit_form( apps::strusCms &cms ) + : cppcms::form( ), + cms( cms ) +{ + title.message( "Title" ); + title.error_message( "The title must not be empty" ); + content.message( "Content" ); + + save.value( "Save" ); + preview.value( "Preview" ); + + add( title ); + add( content ); + add( save ); + add( preview ); + + title.non_empty( ); +} + +bool page_edit_form::validate( ) +{ + if( !form::validate( ) ) { + return false; + } + + return true; +} + +} // namespace content diff --git a/src/page.hpp b/src/page.hpp new file mode 100644 index 0000000..f3ac5d0 --- /dev/null +++ b/src/page.hpp @@ -0,0 +1,60 @@ +#ifndef PAGE_HPP +#define PAGE_HPP + +#include "master.hpp" + +#include "page_content.hpp" + +#include + +namespace apps { + +class page : public master { + public: + page( strusCms &cms ); + + private: + void display( std::string slug ); + void api_pages( ); + void api_page( std::string slug ); + void ini( content::page &c ); +}; + +} // namespace apps + +struct Page { + std::string slug; + std::string title; + std::string content; +}; + +namespace cppcms { + namespace json { + +template<> +struct traits { + + static Page get( value const &v ) + { + Page p; + if( v.type( ) != is_object) { + throw bad_value_cast( ); + } + p.slug = v.get( "slug" ); + p.title = v.get( "title" ); + p.content = v.get( "content" ); + return p; + } + + static void set( value &v, Page const &p ) + { + v.set( "slug", p.slug ); + v.set( "title", p.title ); + v.set( "content", p.content ); + } + +}; + +} } // namespace cppcms::json + +#endif diff --git a/src/page_content.hpp b/src/page_content.hpp new file mode 100644 index 0000000..e21d33f --- /dev/null +++ b/src/page_content.hpp @@ -0,0 +1,32 @@ +#ifndef PAGE_CONTENT_HPP +#define PAGE_CONTENT_HPP + +#include "master_content.hpp" + +#include + +namespace content { + +struct page_edit_form : public cppcms::form { + apps::strusCms &cms; + cppcms::widgets::text title; + cppcms::widgets::textarea content; + cppcms::widgets::submit save; + cppcms::widgets::submit preview; + + public: + page_edit_form( apps::strusCms &cms ); + virtual bool validate( ); + +}; + +struct page : public master { + page_edit_form page_edit; + + public: + page( apps::strusCms &cms ); +}; + +} // namespace content + +#endif diff --git a/src/strusCms.cpp b/src/strusCms.cpp index b5e6b7b..3a108f5 100644 --- a/src/strusCms.cpp +++ b/src/strusCms.cpp @@ -22,9 +22,10 @@ namespace apps { strusCms::strusCms( cppcms::service &srv ) : cppcms::application( srv ), - user( *this ), - intro( *this ), master( *this ), + intro( *this ), + user( *this ), + page( *this ), conn( settings( ).get( "strusCms.db_connection" ) ), mail( settings( ).get( "strusCms.mail.server" ), settings( ).get( "strusCms.mail.port" ), @@ -39,9 +40,10 @@ strusCms::strusCms( cppcms::service &srv ) cppdb::session sql( conn ); sql.once( setup_dbconnection ); - add( user ); - add( intro ); add( master ); + add( intro ); + add( user ); + add( page ); master.register_common_pages( ); diff --git a/src/strusCms.hpp b/src/strusCms.hpp index 9f2bba4..285f026 100644 --- a/src/strusCms.hpp +++ b/src/strusCms.hpp @@ -3,9 +3,10 @@ #include +#include "mail.hpp" #include "intro.hpp" #include "user.hpp" -#include "mail.hpp" +#include "page.hpp" namespace apps { @@ -15,9 +16,10 @@ class strusCms : public cppcms::application { std::string root( std::string locale_name = "" ); public: - apps::user user; - apps::intro intro; apps::master master; + apps::intro intro; + apps::user user; + apps::page page; std::string conn; mailer mail; diff --git a/src/user.cpp b/src/user.cpp index 942684f..33e7296 100644 --- a/src/user.cpp +++ b/src/user.cpp @@ -34,10 +34,12 @@ user::user( strusCms &cms ) cms.mapper( ).assign( "register" ); cms.dispatcher( ).assign( "/confirm_register", &user::confirm_register, this ); - cms.mapper( ).assign( "confirm_register" ); + //?? + //~ cms.mapper( ).assign( "confirm_register" ); cms.dispatcher( ).assign( "/api/users", &user::api_users, this ); - cms.mapper( ).assign( "api_users" ); + + cms.dispatcher( ).assign( "/api/user/(\\w+)", &user::api_user, this, 1 ); } void user::login( ) @@ -144,6 +146,25 @@ void user::api_users( ) response( ).out( ) << j; } + +void user::api_user( std::string username ) +{ + cppdb::session sql( cms.conn ); + cppdb::result r; + r = sql << "SELECT username, email FROM user WHERE username=?" << username << cppdb::row; + if( r.empty( ) ) { + return; + } + User user; + r >> user.name; + r >> user.email; + + cppcms::json::value j; + + j = user; + + response( ).out( ) << j; +} // TODO: make this a salted hash bool user::check_login( const std::string user, const std::string password ) diff --git a/src/user.hpp b/src/user.hpp index 62b3f0a..8960512 100644 --- a/src/user.hpp +++ b/src/user.hpp @@ -27,11 +27,12 @@ class user : public master { void logout( ); void register_user( ); void confirm_register( ); - void api_users( ); void ini( content::user &c ); + void api_users( ); + void api_user( std::string username ); }; -} +} // namespace user struct User { std::string name; -- cgit v1.2.3-54-g00ecf