summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Baumann <mail@andreasbaumann.cc>2015-05-03 21:14:36 +0200
committerAndreas Baumann <mail@andreasbaumann.cc>2015-05-03 21:14:36 +0200
commita07e48f45e3b922a63aaae58b5bd816b8e324ee1 (patch)
treec2258783ecacc7005226acedc198ca332763e992
parent549dffeef49ae25c89d4d1cc6c71c715edfb753f (diff)
downloadaCms-a07e48f45e3b922a63aaae58b5bd816b8e324ee1.tar.gz
aCms-a07e48f45e3b922a63aaae58b5bd816b8e324ee1.tar.bz2
started to add pages
-rw-r--r--CMakeLists.txt5
-rw-r--r--sql/sqlite3.sql8
-rw-r--r--src/content.hpp1
-rw-r--r--src/page.cpp113
-rw-r--r--src/page.hpp60
-rw-r--r--src/page_content.hpp32
-rw-r--r--src/strusCms.cpp10
-rw-r--r--src/strusCms.hpp8
-rw-r--r--src/user.cpp25
-rw-r--r--src/user.hpp5
10 files changed, 254 insertions, 13 deletions
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 <cppcms/url_dispatcher.h>
+#include <cppcms/url_mapper.h>
+#include <cppdb/frontend.h>
+
+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<Page> 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 <cppcms/json.h>
+
+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<Page> {
+
+ static Page get( value const &v )
+ {
+ Page p;
+ if( v.type( ) != is_object) {
+ throw bad_value_cast( );
+ }
+ p.slug = v.get<std::string>( "slug" );
+ p.title = v.get<std::string>( "title" );
+ p.content = v.get<std::string>( "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 <cppcms/form.h>
+
+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<std::string>( "strusCms.db_connection" ) ),
mail( settings( ).get<std::string>( "strusCms.mail.server" ),
settings( ).get<unsigned short>( "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 <cppcms/application.h>
+#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;