Branch data Line data Source code
1 : : // ***************************************************************************** 2 : : /*! 3 : : \file src/document.hpp 4 : : \copyright 2022-2025 J. Bakosi, 5 : : All rights reserved. See the LICENSE file for details. 6 : : \brief Piac document classes to interact with database library 7 : : */ 8 : : // ***************************************************************************** 9 : : 10 : : #pragma once 11 : : 12 : : #include "jsonbase.hpp" 13 : : 14 : : namespace piac { 15 : : 16 : : //! Document class to hold a database document and help with JSON serialization 17 : : class Document : public JSONBase { 18 : : public: 19 : : //! Deserialize document state from JSON object 20 : : bool deserialize( const rapidjson::Value& obj ) override; 21 : : 22 : 15 : bool deserialize( const std::string& s ) override { 23 : 15 : return JSONBase::deserialize( s ); 24 : : } 25 : : 26 : : bool serialize( rapidjson::Writer<rapidjson::StringBuffer>* writer ) 27 : : const override; 28 : : 29 : 22 : [[nodiscard]] std::string serialize() const override { 30 : 22 : return JSONBase::serialize(); 31 : : } 32 : : 33 : 7 : int id() const { return m_id; } 34 : 25 : void id( int i ) { m_id = i; } 35 : : 36 : 14 : const std::string& title() const { return m_title; } 37 : 25 : void title( const std::string& t ) { m_title = t; } 38 : : 39 : 15 : const std::string& author() const { return m_author; } 40 : 47 : void author( const std::string& a ) { m_author = a; } 41 : : 42 : 14 : const std::string& description() const { return m_description; } 43 : 25 : void description( const std::string& d ) { m_description = d; } 44 : : 45 : 7 : double price() const { return m_price; } 46 : 25 : void price( double p ) { m_price = p; } 47 : : 48 : 14 : const std::string& category() const { return m_category; } 49 : 25 : void category( const std::string& t ) { m_category = t; } 50 : : 51 : 14 : const std::string& condition() const { return m_condition; } 52 : 25 : void condition( const std::string& t ) { m_condition = t; } 53 : : 54 : 14 : const std::string& shipping() const { return m_shipping; } 55 : 25 : void shipping( const std::string& t ) { m_shipping = t; } 56 : : 57 : 14 : const std::string& format() const { return m_format; } 58 : 25 : void format( const std::string& t ) { m_format = t; } 59 : : 60 : 14 : const std::string& location() const { return m_location; } 61 : 25 : void location( const std::string& t ) { m_location = t; } 62 : : 63 : 14 : const std::string& keywords() const { return m_keywords; } 64 : 25 : void keywords( const std::string& t ) { m_keywords = t; } 65 : : 66 : : // SHA is not serialized, but regenerated when needed 67 : 7 : const std::string& sha() const { return m_sha; } 68 : 7 : void sha( const std::string& s ) { m_sha = s; } 69 : : 70 : : private: 71 : : int m_id; 72 : : std::string m_title; 73 : : std::string m_author; 74 : : std::string m_description; 75 : : double m_price; 76 : : std::string m_category; 77 : : std::string m_condition; 78 : : std::string m_shipping; 79 : : std::string m_format; 80 : : std::string m_location; 81 : : std::string m_keywords; 82 : : std::string m_sha; 83 : : }; 84 : : 85 : : //! Multiple document hold a list of database documents 86 : : class Documents : public JSONBase { 87 : : public: 88 : : bool deserialize( const std::string& s ) override; 89 : : 90 : 0 : bool deserialize( const rapidjson::Value& ) override { return false; } 91 : : 92 : : bool serialize( rapidjson::Writer<rapidjson::StringBuffer>* writer ) 93 : : const override; 94 : : 95 : 0 : [[nodiscard]] std::string serialize() const override { 96 : 0 : return JSONBase::serialize(); 97 : : } 98 : : 99 : : const std::vector< Document >& documents() const { return m_documents; } 100 : 6 : std::vector< Document >& documents() { return m_documents; } 101 : : 102 : : const Document& operator[]( std::size_t i ) const { return m_documents[i]; } 103 : : Document& operator[]( std::size_t i ) { 104 : : return const_cast< Document& >( 105 : : static_cast< const Documents& >( *this ).operator[]( i ) ); 106 : : } 107 : : 108 : : private: 109 : : std::vector< Document > m_documents; 110 : : }; 111 : : 112 : : } // piac::